home *** CD-ROM | disk | FTP | other *** search
/ MacWorld Secrets (4th Edition) / Mac Secrets CD 4th Ed.toast / Apple Advanced Technologies / Apple Speech Technologies 1.5 / PlainTalk Developer Info / Speech Synthesis Manager SDK / Documentation / The Speech Manager / The Speech Manager next >
Text File  |  1993-09-15  |  412KB  |  1,070 lines

  1. The Speech ManagerSpeech Manager Overview   2Speech Manager Concepts   3Using the Speech Manager   4Getting Started   4Determining If the Speech Manager Is Available   4Which Version of the Speech Manager Is Running?   5Making Some Noise   5Determining If Speaking Is Complete   6A Simple Example   6Essential Calls—Simple and Useful   7Working With Voices   7Managing Connections to Speech Synthesizers   11Starting and Stopping Speech   13Using Basic Speech Controls   14Putting It All Together   17Advanced Routines   18Advanced Speech Controls   19Converting Text Into Phonemes   23Getting Information About a Speech Channel   24Advanced Control Routines   30Application-Defined Pronunciation Dictionaries   36Associating a Dictionary With a Speech Channel   37Pronunciation Dictionary Data Format   38Creating and Editing Dictionaries   39Advanced Voice Information Routines   39Embedded Speech Commands   40Embedded Speech Command Syntax   41Embedded Speech Command Set   42Embedded Speech Command Error Reporting   45Summary of Phonemes and Prosodic Controls   45Summary of the Speech Manager   49This document describes the Apple® Speech Manager, which provides a standardized method for Macintosh® applications to generate synthesized speech.The document provides an overview of the Speech Manager followed by general information about generating speech from text. The necessary information and calls needed by all text-to-speech applications are given next, followed by a simple example of speech generation. More advanced calls and special-purpose routines are described last.Speech Manager OverviewA complete system for speech synthesis consists of the elements shown in Figure 1-1.Figure 1-1    Speech synthesis componentsAn application calls routines in the Speech Manager to convert character strings into speech and to adjust various parameters that affect the quality or character of the spoken output. The Speech Manager is responsible for dispatching these requests to a speech synthesizer. The speech synthesizer converts the text into sound and creates the actual audio output. The Apple-supplied voices, pronunciation dictionaries, and speech synthesizer may reside in a single file or in separate files. These files are clearly identifiable as Speech Manager–related files and are installed and removed by being dragged into or out of the System Folder. Additional voices can be provided by bundling the resources in the resource forks of specific applications. These resources are considered private to that particular application. It is up to the individual developers to decide whether the voice resources they provide are usable on a systemwide basis or only from within their applications. In the first release of the Speech Manager, pronunciation dictionaries are managed entirely by the application. The application is free to store dictionaries in either the resource or the data fork of a file. The application is responsible for loading the individual dictionaries into RAM and then passing a handle to the dictionary data to the Speech Manager.Applications that use the Speech Manager must provide their own human interface for selecting voices and/or controlling other speech characteristics. If voices are provided in separate files, the speech synthesizer developer is responsible for providing a method for installing these resources into the System Folder or Extensions folder. The computer must be rebooted after speech synthesizers are added to or removed from the System Folder for the desired changes to be recognized.Speech Manager ConceptsOn a simple level, speech synthesis from text input is a two-stage process. First, plain-language English text is converted into phonemic representations for the individual words. Phonemes stand for specific sounds; for a complete explanation, see “Summary of Phonemes and Prosodic Controls,” later in this document. The resulting sequence of phonemes is converted into audible sounds by mapping of the individual phonemes to a series of waveforms, which are sent to the sound hardware to be played.In reality, each stage is more complicated than this description suggests. For example, during the text-to-phoneme conversion stage, number strings, abbreviations, and special symbols must be detected and converted into appropriate words before being converted into phonemes. When a sentence such as “He earned over $2,000,000 in 1990” is spoken, it would normally be preferable to say “He earned over two million dollars in nineteen- ninety” rather than “He earned over dollar-sign, two, comma, zero, zero, zero, comma, zero, zero, zero, in one, nine, nine, zero.” To produce the desired spoken output automatically, knowledge of these sorts of constructions is built into the synthesizer.The phoneme-to-sound conversion stage is also complex. Phonemes by themselves are often not sufficient to describe the way a word should be pronounced. For example, the word “object” is pronounced differently depending on whether it is used as a noun or a verb. (When it is used as a noun, the stress is placed on the first syllable. As a verb, the stress is placed on the second syllable.) In addition to stress information, phonemes must often be augmented with pitch, duration, and other information to produce intelligible, natural-sounding speech.The speech synthesizer has many built-in rules for automatically converting text into the complex phonemic representation described above. However, there will always be words and phrases that are not pronounced the way you want. The Speech Manager allows you to provide raw phonemic information directly in order to enable very precise control over the spoken output.By default, speech synthesizers expect input in normal language text. However, using the input mode controls of the Speech Manager, you can tell the synthesizer to process input text in raw phonemic form. By using the embedded commands described in the next section, you can even mix normal language text with phonemic text within a single string or text buffer.See “Summary of Phonemes and Prosodic Controls,” later in this document, for a listing of the phonemic character set and each character’s interpretation.Using the Speech ManagerThis section describes the routines used to add speech synthesis features to an application. It is organized into three sections: “Getting Started” (Easy), “Essential Calls—Simple and Useful” (Intermediate), and “Advanced Routines.”Getting StartedIf you’re just getting started with text-to-speech conversion using the Speech Manager, the following routines will get you up and running with minimal effort. If you’re developing an application that does not need to choose voices, use more than one channel of speech, or exercise real-time control over the synthesized speech, these may be the only routines you need.Determining If the Speech Manager Is AvailableYou can find out if the Speech Manager is available with a single call to the Gestalt Manager. Use the Gestalt toolbox routine and the selector gestaltSpeechAttr to determine whether or not the Speech Manager is available, as shown in Listing 1-1. If Gestalt returns noErr, then the parameter argument will contain a 32-bit value indicating one or more attributes of the installed Speech Manager. If the Speech Manager exists, the bit specified by gestaltSpeechMgrPresent is set.Listing 1-1    Determining if the Speech Manager is availableBoolean SpeechAvailable (void) {    OSErr            err;    long            result;    err = Gestalt(gestaltSpeechAttr, &result);    if ((err != noErr) || !(result &             (1 << gestaltSpeechMgrPresent)))        return FALSE;    else        return TRUE;}Which Version of the Speech Manager Is Running?Once you have determined that the Speech Manager is installed, you can see which version of the Speech Manager is running by calling SpeechManagerVersion.SpeechManagerVersionReturns the version of the Speech Manager installed in the system.pascal NumVersion SpeechManagerVersion (void);DESCRIPTIONSpeechManagerVersion returns the version of the Speech Manager installed in the system. This call should be used to determine the compatibility of your program with the currently installed Speech Manager.RESULT CODESNoneMaking Some NoiseThe most basic operation of the Speech Manager is accomplished by using the SpeakString call. This call passes a specific text string to be spoken to the Speech Manager.SpeakStringThe SpeakString function passes a specific text string to be spoken to the Speech Manager.pascal OSErr SpeakString (StringPtr myString);Field descriptionsmyString    Text string to be spokenDESCRIPTIONSpeakString attempts to speak the Pascal-style text string contained in myString. Speech is produced asynchronously using the default system voice. When an application calls this function, the Speech Manager makes a copy of the passed string and creates any structures required to speak it. As soon as speaking has begun, control is returned to the application. The synthesized speech is generated transparently to the application so that normal processing can continue while the text is being spoken. No further interaction with the Speech Manager is required at this point, and the application is free to release or purge or trash the original string.If SpeakString is called while a prior string is still being spoken, the audio currently being synthesized is interrupted immediately. Conversion of the new text into speech is then initiated. If an empty (zero length) string or a null string pointer is passed to SpeakString, it stops the synthesis of any prior string but does not generate any additional speech.As with all Speech Manager routines that expect text arguments, the text may contain embedded speech control commands. Result CodesnoErr    0    No error    memFullErr    –108    Not enough memory to speak    synthOpenFailed    –241    Could not open another speech synthesizer channel    Determining If Speaking Is CompleteOnce an application starts a speech process with SpeakString, the next thing it will probably need to know is whether the string has been completely spoken. It can use SpeechBusy to determine whether or not the system is still speaking.SpeechBusyThe SpeechBusy routine is useful when you want to ensure that an earlier speech request has been completed before having the system speak again.pascal short SpeechBusy (void);DESCRIPTIONSpeechBusy returns the number of channels of speech that are currently synthesizing speech in the application. If you use just SpeakString to initiate speech, SpeechBusy will always return 1 as long as speech is being produced. When SpeechBusy returns 0, all initiated speech has finished. RESULT CODESNoneA Simple ExampleThe example shown in Listing 1-2 demonstrates how to use the routines introduced in this section. It first makes sure the Speech Manager is available. Then it starts speaking a string (hard-coded in this example, but more commonly loaded from a resource) and loops, doing some screen drawing, until the string is completely spoken. This example uses the SpeechAvailable routine shown in Listing 1-1.Listing 1-2    Elementary Speech Manager callsOSErr err;if (SpeechAvailable()) {    err = SpeakString("\pThe cat sat on the mat.");    if (err == noErr)        while (SpeechBusy() > 0)            CoolAnimationRoutine();    else        NotSoCoolAlertRoutine(err);}Essential Calls—Simple and UsefulWhile the routines presented in the last section are simple to use, their applicability is limited to a few basic speech scenarios. This section describes additional routines that let you work with different voices and adjust some basic characteristics of the synthesized speech.Working With VoicesWhen describing a person’s voice, we talk about the particular set of characteristics that help us to distinguish that person’s voice from another. For example, the rate at which one speaks (slow or fast) and the average pitch (high or low) characterize a particular speaker on a crude level. In the context of the Speech Manager, a voice is the set of parameters that specify a particular quality of synthesized speech. This portion of the Speech Manager is used to determine which voices are available and to select particular voices.Every specific voice has a unique ID associated with it, which is the primary way an application refers to it. Within the Speech Manager a unique voice ID is called a VoiceSpec structure.The Speech Manager provides two routines to count and step through the list of currently available voices. CountVoices is used to compute how many voices are available with the current system. GetIndVoice uses an index, starting at 1, to return information about all currently installed voices.Use the GetIndVoice routine to step through the list of available voices. It will fill a VoiceSpec record that can be used to obtain descriptive information about the voice or to speak using that voice.Any application that wishes to use multiple voices will probably need additional information about the available voices beyond the VoiceSpec structure, such as the name of the voice and perhaps what script and language each voice supports. This information might be presented to the user in a “voice picker” dialog box or voice menu, or it might be used internally by an application trying to find a voice that meets certain criteria. Applications can use the GetVoiceDescription routine for these purposes.MakeVoiceSpecTo maximize compatibility with future versions of the Speech Manager, you should always use MakeVoiceSpec instead of setting the fields of the VoiceSpec structure directly.pascal OSErr MakeVoiceSpec (OSType creator, OSType id, VoiceSpec *voice);typedef struct VoiceSpec {    OSType            creator;         // determines which synthesizer is required     OSType            id;             // voice ID on the specified synth } VoiceSpec;Field descriptionscreator    The synthesizer required by your applicationid    Identification number for this voice*voice    Pointer to the VoiceSpec structureDESCRIPTIONMost voice management routines expect to be passed a pointer to a VoiceSpec structure. MakeVoiceSpec is a utility routine provided to facilitate the creation of VoiceSpec records. On return, the passed VoiceSpec structure contains the appropriate values.Voices are stored in resources of type 'ttsv' in the resource fork of Macintosh files. The Speech Manager uses the same search method as the Resource Manager, looking for voice resources in three different locations when attempting to resolve VoiceSpec references. It first looks in the application’s resource file chain. If the specified voice is not found in an open file, it then looks in the System Folder and the Extensions folder (or in just the System Folder under System 6) for files of type 'ttsv' (single-voice files) or 'ttsb' (multivoice files) and in text-to-speech synthesizer component files (file type 'INIT' or 'thng'). Voices stored in the System Folder or Extensions folder are normally available to all applications. Voices stored in the resource fork of an application files are private to the application.RESULT CODEnoErr    0    No error    While the determination of specific voice ID values is mostly left to synthesizer developers, the voice creator values are specified by Apple (they would ordinarily correspond to a developer’s currently assigned creator ID). For both the creator and id fields Apple further reserves the set of OSType values specified entirely by space characters and lowercase letters. Apple is establishing a standard suite of voice ID values that developers can count upon being available with all speech synthesizers.CountVoicesThe CountVoices routine returns the number of voices available.pascal OSErr CountVoices (short *voiceCount);Field descriptionsvoiceCount    Number of voices available to the applicationDESCRIPTIONEach time CountVoices is called, the Speech Manager searches for new voices. This algorithm supports dynamic installation of voices by applications or users. On return, the voiceCount parameter contains the number of voices available.RESULT CODESnoErr    0    No error    GetIndVoiceThe GetIndVoice routine returns information about a specific voice.pascal OSErr GetIndVoice (short index, VoiceSpec *voice);Field descriptionsindex    Index value for a specific voice*voice    Pointer to the VoiceSpec structureDESCRIPTIONAs with all other index-based routines in the Macintosh Toolbox, an index value of 1 causes GetIndVoice to return information for the first voice. The order that voices are returned is not presently defined and should not be assumed. Speech Manager behavior when voice files or resources are added, removed, or modified is also presently undefined. However, calling CountVoices or GetIndVoice with an index of 1 will force the Speech Manager to update its list of available voices. GetIndVoice will return a voiceNotFound error if the passed index value exceeds the number of available voices.RESULT CODESnoErr    0    No error    voiceNotFound    –244    Voice resource not found    GetVoiceDescriptionThe GetVoiceDescription routine returns information about a voice beyond that provided by GetIndVoice.pascal OSErr GetVoiceDescription (VoiceSpec *voice,            VoiceDescription *info, long infoLength);enum {kNeuter = 0, kMale, kFemale};    // returned in gender field below typedef struct VoiceDescription {    long                length;                    // size of structure     VoiceSpec                voice;                    // synth and ID info for voice     long                version;                    // version code for voice     Str63                name;                    // name of voice     Str255                comment;                    // additional text info about voice     short                gender;                    // neuter, male, or female     short                age;                    // approximate age in years     short                script;                    // script code of text voice can process     short                language;                    // language code of voice output speech     short                region;                    // region code of voice output speech     long                reserved[4];                    // always zero - reserved } VoiceDescription;Field descriptions*voice    Pointer to the VoiceSpec structure*info    Pointer to structure containing parameters for the specified voiceinfoLength    Length in bytes of info structureDESCRIPTIONThe Speech Manager fills out the passed VoiceDescription fields with the correct information for the specified voice. If a null VoiceSpec pointer is passed, the Speech Manager returns information for the system default voice. If the VoiceDescription pointer is null, the Speech Manager simply verifies that the specified VoiceSpec refers to an available voice. If VoiceSpec does not refer to a known voice, GetVoiceDescription returns a voiceNotFound error, as shown in Listing 1-3.To maximize compatibility with future versions of the Speech Manager, the application must pass the size of the VoiceDescription structure. Having the application do this ensures that the Speech Manager will never write more data into the passed structure than will fit even if additional information fields are defined in the future. On returning from GetVoiceDescription, the length field is set to reflect the length of data actually written by this routine.Listing 1-3    Getting information about a voiceOSErr GetVoiceGender (VoiceSpec *voicePtr, short *gender) {    OSErr                err;    VoiceDescription        vd;    err = GetVoiceDescription        (voicePtr,&vd,sizeof(VoiceDescription));    if (err == noErr) {        if (vd.length > offsetof(VoiceDescription,gender))            *gender = vd.gender;        else            err = badStructLen;    }    return err;}RESULT CODESnoErr    0    No error    paramErr    –50    Parameter error    memFullErr    –108    Not enough memory to load voice into memory    voiceNotFound    –244    Voice resource not found    Managing Connections to Speech SynthesizersUsing the routines described earlier in this document, an application can select the voice with which to speak. The next step is to associate the selected voice with the proper speech synthesizer. This is accomplished by creating a new speech channel with the NewSpeechChannel routine. A speech channel is a private communication connection to the speech synthesizer, much as a file reference number is a communication channel to an open file in the Macintosh file system.The DisposeSpeechChannel routine closes a speech channel when the application is finished with it and releases any resources that have been allocated to support the speech synthesizer and are no longer needed.NewSpeechChannelThe NewSpeechChannel routine creates a new speech channel.pascal OSErr NewSpeechChannel (VoiceSpec *voice,     SpeechChannel *chan);Field descriptions*voice    Pointer to the VoiceSpec structure*chan    Pointer to the new channelDESCRIPTIONThe Speech Manager automatically locates and opens a connection to the proper synthesizer for a specified voice and sets up a channel at the location pointed to by *chan so that it is ready to speak with that voice. If a null VoiceSpec pointer is passed to NewSpeechChannel, the Speech Manager uses the current system default voice.There is no predefined limit to the number of speech channels an application may create. However, system constraints on available RAM, processor loading, and number of available sound channels may limit the number of speech channels actually possible.RESULT CODESnoErr    0    No error    memFullErr    –108    Not enough memory to open speech channel    synthOpenFailed    –241    Could not open another speech synthesizer channel    voiceNotFound    –244    Voice resource not found    DisposeSpeechChannelThe DisposeSpeechChannel routine disposes of an existing speech channel.pascal OSErr DisposeSpeechChannel (SpeechChannel chan);Field descriptionschan    Specific speech channelDESCRIPTIONThis routine disposes of an existing speech channel. Any speech channels that have not been explicitly disposed of by the application are released automatically by the Speech Manager when the application quits.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    Starting and Stopping SpeechAll the remaining routines in this section require a valid speech channel to work properly. Once the application has successfully created a speech channel, it can start to speak. You use the SpeakText routine to begin speaking on a speech channel.At any time during the speaking process, the application can stop the synthesizer’s speech. The StopSpeech routine will immediately abort any speech being produced on the specified speech channel and force the channel back into an idle state.SpeakTextThe SpeakText routine converts a designated text into speech.pascal OSErr SpeakText (SpeechChannel chan, Ptr textBuf, long    byteLength);Field descriptionschan    Specific speech channeltextBuf    Buffer of textbyteLength    Length of textBufDESCRIPTIONIn addition to a valid speech channel, SpeakText expects a pointer to the text to be spoken and the length in bytes of the text buffer. SpeakText will convert the given text stream into speech using the voice and control settings for that speech channel. The speech is generated asynchronously. This means that control is returned to your application before the speech has finished (probably even before it has begun). The maximum length of text buffer that can be spoken is limited only by the available RAM. However, it’s generally not very friendly to force the user to listen to long uninterrupted text unless the user requests it. If SpeakText is called while it is currently busy speaking the contents of a prior text buffer, it will immediately stop speaking from the prior buffer and will begin speaking from the new text buffer as soon as possible. As with SpeakString, described on page 5, if an empty (zero length) string or a null text buffer pointer is passed to SpeakText, this will have the effect of stopping the synthesis of any prior text but will not generate any additional speech.sWARNINGWith SpeakText, unlike with SpeakString, the text buffer must be locked in memory and must not move during the entire time that it is being converted into speech. This buffer is read at interrupt time, and very undesirable effects will happen if it moves or is purged from memory.sRESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    StopSpeechThe StopSpeech routine terminates speech delivery on a specified channel.pascal OSErr StopSpeech (SpeechChannel chan);Field descriptionschan    Specific speech channelDESCRIPTIONAfter returning from StopSpeech, the application can safely release any text buffer that that the speech synthesizer has been using. The SpeechBusy routine, described on page 6, can be used to determine if the text has been completely spoken. (In an environment with multiple speech channels, you may need to use the more advanced status routine GetSpeechInfo, described on page 25, to determine if a specific channel is still speaking.) StopSpeech can be called for an already idle channel without ill effect. RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    Using Basic Speech ControlsThe Speech Manager provides several methods of adjusting the variables that can affect the way speech is synthesized. Although most applications probably do not need to use these advanced features, two of the speech variables, speaking rate and speaking pitch, are useful enough that a very simple way of adjusting these parameters on a channel-by-channel basis is provided. Routines are supplied that enable an application to both set and get these parameters. However, the audible effects of changing the rate and pitch of speech vary from synthesizer to synthesizer; you should test the actual results on all synthesizers with which your application may work.Speaking rates are specified in terms of words per minute (WPM). While this unit of measurement is difficult to define in any precise way, it is generally easy to understand and use. The range of supported rates is not predefined by the Speech Manager. Each speech synthesizer provides its own range of speaking rates. Furthermore, any specific rate value will correspond to slightly different rates with different synthesizers. Speaking pitches are defined on a musical scale that corresponds to the keys on a standard piano keyboard. By convention, pitches are represented as fixed-point values in the range from 0.000 through 100.000, where 60.000 corresponds to middle C (261.625 Hz) on a conventional piano. Pitches are represented on a logarithmic scale. On this scale, a change of +12 units corresponds to doubling the frequency, while a change of –12 units corresponds to halving the frequency. For a further discussion of pitch values, see “Getting Information About a Speech Channel,” later in this document.Typical voice frequencies might range from around 90 Hertz for a low-pitched male voice to perhaps 300 Hertz for a high-pitched child’s voice. These frequencies correspond to pitch values of 41.526 and 53.526, respectively.Changes in speech rate and pitch are effective immediately (as soon as the synthesizer can respond), even if they occur in the middle of a word.SetSpeechRateThe SetSpeechRate routine sets the speaking rate on a designated speech channel.pascal OSErr SetSpeechRate (SpeechChannel chan, Fixed rate);Field descriptionschan    Specific speech channelrate    Word output speaking rateDESCRIPTIONThe SetSpeechRate routine is used to adjust the speaking rate on a speech channel. The rate parameter is specified as a fixed-point, words per minute value. As a general rule of thumb, “normal” speaking rates range from around 150 WPM to around 180 WPM. It is important when working with speaking rates, however, to keep in mind that users will differ greatly in their ability to understand synthesized speech at a particular rate based upon their level of experience listening to the voice and their ability to anticipate the types of utterances they will encounter.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    GetSpeechRateThe GetSpeechRate routine returns the speech rate currently active on a designated speech channel.pascal OSErr GetSpeechRate (SpeechChannel chan, Fixed *rate);Field descriptionschan    Specific speech channel*rate    Pointer to the current speaking rateDESCRIPTIONThe GetSpeechRate routine is used to find out the speaking rate currently active on a speech channel.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    SetSpeechPitchThe SetSpeechPitch routine sets the speaking pitch on a designated speech channel.pascal OSErr SetSpeechPitch (SpeechChannel chan, Fixed pitch);Field descriptionschan    Specific speech channelpitch    Frequency of voiceDESCRIPTIONUse the SetSpeechPitch routine to change the current speaking pitch on a speech channel.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    GetSpeechPitchThe GetSpeechPitch routine returns the current speaking pitch on a designated speech channel.pascal OSErr GetSpeechPitch (SpeechChannel chan, Fixed *pitch);Field descriptionschan    Specific speech channelpitch    Frequency of voiceDESCRIPTIONThe GetSpeechPitch routine is used to find out the speaking pitch currently active on a speech channel.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    Putting It All TogetherThe code fragment in Listing 1-4 illustrates many of the routines introduced in this section. The example steps through the list of available voices to find the first female voice. Then it creates a new speech channel and begins speaking. While the voice is speaking, the pitch of the voice is continually adjusted around the original pitch. If the mouse button is pressed while the voice is speaking, the code halts the speech and exits. This example uses the SpeechAvailable and GetVoiceGender routines shown earlier in Listing 1-1 and Listing 1-3.Listing 1-4    Putting it all togetherOSErr                        err;Str255                        myStr = "\pThe bat sat on my hat.";VoiceSpec                        voice;VoiceDescription                         vd;Boolean                        gotVoice = FALSE;short                        voiceCount, gender, i;SpeechChannel                        chan;Fixed                        origPitch, newPitch;if (myStr[0] && SpeechAvailable()) {    err = CountVoices(&voiceCount);                                        // count the available voices     i = 1;    while ((i <= voiceCount) && ((err=GetIndVoice(i++, &voice))             ==noErr))        {        err = GetIndVoice(i++, &voice)) == noErr;        err = GetVoiceGender(&voice, &gender);        if ((err == noErr) && (gender == kFemale)) {            gotVoice = TRUE;            break;        }    }    if (gotVoice) {        err = NewSpeechChannel(&voice, &chan);        if (err == noErr) {            err = GetSpeechPitch(chan, &origPitch); // cur pitch             if (err == noErr)                err = SpeakText(chan, &myStr[1], myStr[0]);                        i = 0;            if (err == noErr)                while (SpeechBusy() > 0) {                    CoolAnimationRoutine();                    newPitch = (i - 4) << 16; // fixed pitch offset                     newPitch += origPitch;                    i = (i + 1) & 7;    // steps from 0 to 7 repeatedly                     err = SetSpeechPitch(chan, newPitch);                    if ((err != noErr) || Button()) {                        err = StopSpeech(chan);                        break;                    }                }            err = DisposeSpeechChannel(chan);        }    }    if (err != noErr)        NotSoCoolAlertRoutine(err);Advanced RoutinesThis section describes several advanced or rarely-used Speech Manager routines. You can use them to improve the quality of your application’s speech.Advanced Speech ControlsThe StopSpeech routine, described in “Starting and Stopping Speech,” earlier in this document, provides a simple way to interrupt any speech output instantly. In some situations it is preferable to be able to stop speech production at the next natural boundary, such as the next word or the end of the current sentence. StopSpeechAt provides that capability.Similarly, the PauseSpeechAt routine causes speech to pause at a specified point in the text being spoken; the ContinueSpeech routine resumes speech after it has paused.In addition to SpeakString and SpeakText, described earlier in this document, the Speech Manager provides a third, more general routine. SpeakBuffer is the low-level speech routine upon which the other two are built. SpeakBuffer provides greater control through the use of an additional flags parameter.The SpeechBusySystemWide routine tells you if any speech is currently being synthesized in your application or elsewhere on the computer.StopSpeechAtThe StopSpeechAt routine halts speech at a specific point in the text being spoken.pascal OSErr StopSpeechAt (SpeechChannel chan, long whereToStop);enum {    kImmediate                        = 0,    kEndOfWord                        = 1,    kEndOfSentence                        = 2};Field descriptionschan    Specific speech channelwhereToStop    Location in text at which speech is to stop DESCRIPTIONStopSpeechAt is used to halt the production of speech at a specified point in the text. The whereToStop argument should be set to one of the following constants:n    The kImmediate constant stops speech output immediately. n    The kEndOfWord constant lets speech continue until the current word has been spoken. n    The kEndOfSentence constant lets speech continue until the end of the current sentence has been reached. This routine returns immediately, although speech output continues until the specified point has been reached.sWARNINGYou must not release the memory associated with the current text buffer until the channel status indicates that the speech channel output is no longer busy.sIf the end of the input text buffer is reached before the specified stopping point, the speech synthesizer will stop at this point. Once the stopping point has been reached, the application is free to release the text buffer. Calling StopSpeechAt with whereToStop equal to kImmediate is equivalent to calling StopSpeech, described on page 14. Contrast the StopSpeechAt routine with PauseSpeech, described next.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    PauseSpeechAtThe PauseSpeechAt routine causes speech to pause at a specified point in the text being spoken.pascal OSErr PauseSpeechAt (SpeechChannel chan,         long whereToPause);enum {    kImmediate                        = 0,    kEndOfWord                        = 1,    kEndOfSentence                        = 2};Field descriptionschan    Specific speech channelwhereToPause    Location in text at which speech is to pause DESCRIPTIONPauseSpeech makes speech production pause at a specified point in the text. The whereToPause parameter should be set to one of these constants: n    The kImmediate constant stops speech output immediately. n    The kEndOfWord constant lets speech continue until the current word has been spoken. n    The kEndOfSentence constant lets speech continue until the end of the current sentence has been reached. When the specified point is reached, the speech channel enters the paused state, reflected in the channel’s status. PauseSpeechAt returns immediately, although speech output will continue until the specified point.If the end of the input text buffer is reached before the specified pause point, speech output pauses at the end of the buffer.PauseSpeechAt differs from StopSpeech and StopSpeechAt in that a subsequent call to ContinueSpeech, described next, causes the contents of the current text buffer to continue being spoken.sWARNINGWhile in a paused state, the last text buffer must remain available at all times and must not move. While paused, the SpeechChannel status indicates outputBusy = true and outputPaused = true.sRESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    ContinueSpeechThe ContinueSpeech routine resumes speech after it has been halted by the PauseSpeechAt routine.pascal OSErr ContinueSpeech (SpeechChannel chan);Field descriptionschan    Specific speech channelDESCRIPTIONAt any time after PauseSpeechAt is called, ContinueSpeech may be called to continue speaking from the point at which speech paused. Calling ContinueSpeech on a channel that is not currently in a pause state has no effect; calling it before a pause is effective cancels the pause.RESULT CODESnoErr    0    No error    invalidComponentID    –3000    Invalid SpeechChannel parameter    SpeakBufferThe SpeakBuffer routine causes the contents of a text buffer to be spoken, using certain flags to control speech behavior.pascal OSErr SpeakBuffer (SpeechChannel chan, Ptr textBuf,                                 long byteLength, long controlFlags);enum {    kNoEndingProsody                            = 1,    kNoSpeechInterrupt                            = 2,    kPreflightThenPause                            = 4};Field descriptionschan    Specific speech channeltextBuf    Buffer of textbyteLength    Length of textBufcontrolFlags    Control flags to control speech behavior DESCRIPTIONWhen the controlFlags parameter is set to 0, SpeakBuffer behaves identically to SpeakText, described on page 13.The kNoEndingProsody flag bit is used to control whether or not the speech synthesizer automatically applies ending prosody, the speech tone and cadence that normally occur at the end of a statement. Under normal circumstances (for example, when the flag bit is not set), ending prosody is applied to the speech when the end of the textBuf data is reached. This default behavior can be disabled by setting the kNoEndingProsody flag bit.Some synthesizers do not speak until the kNoEndingProsody flag bit is reset, or they encounter a period in the text, or textBuf is full. The kNoSpeechInterrupt flag bit is used to control the behavior of SpeakBuffer when called on a speech channel that is still busy. When the flag bit is not set, SpeakBuffer behaves similarly to SpeakString and SpeakText, described earlier in this document. Any speech currently being produced on the specified speech channel is immediately interrupted and then the new text buffer is spoken. When the kNoSpeechInterrupt flag bit is set, however, a request to speak on a channel that is still busy processing a prior text buffer will result in an error. The new buffer is ignored and the error synthNotReady is returned. If the prior text buffer has been fully processed, the new buffer is spoken normally. The kPreflightThenPause flag bit is used to minimize the latency experienced when attempting to speak. Ordinarily whenever a call to SpeakString, SpeakText, or SpeakBuffer is made, the speech synthesizer must perform a certain amount of initial processing before speech output is heard. This startup latency can vary from a few milliseconds to several seconds depending upon which speech synthesizer is being used. Recognizing that larger startup delays may be detrimental to certain applications, a mechanism is provided to provide the synthesizer a chance to perform any necessary computations at noncritical times. Once the computations have been completed, the speech is able to start instantly. When the kPreflightThenPause flag bit is set, the speech synthesizer will process the input text as necessary to the point where it is ready to begin producing speech output. At this point, the synthesizer will enter a paused state and return to the caller. When the application is ready to produce speech, it should call the ContinueSpeech routine to begin speaking.RESULT CODESnoErr    0    No error    synthNotReady    –242    Speech channel is still busy speaking    invalidComponentID    –3000    Invalid SpeechChannel parameter    SpeechBusySystemWideYou can use SpeechBusySystemWide to determine if any speech is currently being synthesized in your application or elsewhere on the computer.pascal short SpeechBusySystemWide (void);DESCRIPTIONThis routine is useful when you want to ensure that no speech is currently being produced anywhere on the Macintosh computer. SpeechBusySystemWide returns the total number of speech channels currently synthesizing speech on the computer, whether they were initiated by your code or by some other process executing concurrently.RESULT CODESNoneConverting Text Into PhonemesIn some situations it is desirable to convert a text string into its equivalent phonemic representation. This may be useful during the content development process to fine-tune the pronunciation of particular words or phrases. By first converting the target phrase into phonemes, you can see what the synthesizer will try to speak. Then you need only correct the parts that would not have been spoken the way you want.TextToPhonemesThe TextToPhonemes routine converts a designated text to phoneme codes.pascal OSErr TextToPhonemes (SpeechChannel chan, Ptr textBuf,                                     long textBytes, Handle phonemeBuf,                                     long *phonemeBytes);Field descriptionschan    Specific speech channeltextBuf    Buffer of texttextBytes    Length of textBuf in bytesphonemeBuf    Buffer of phonemes*phonemeBytes    Pointer to length of phonemeBuf in bytesDESCRIPTIONIt may be useful to convert your text into phonemes during application development in order to be able to reduce the amount of memory required to speak. If your application does not require the text-to-phoneme conversion portion of the speech synthesizer, significantly less RAM may be required to speak with some synthesizers. Additionally, you may be able to use a higher quality text-to-phoneme conversion process (even one that does not work in real time) to generate precise phonemic information. This data can then be used with any speech synthesizer to produce better speech.TextToPhonemes accepts a valid SpeechChannel parameter, a pointer to the characters to be converted into phonemes, the length of the input text buffer in bytes, an application-supplied handle into which the converted phonemes can be written, and a length parameter. On return, the phonemeBytes argument is set to the number of phoneme character bytes that were written into phonemeBuf. The data returned by TextToPhonemes will correspond precisely to the phonemes that would be spoken had the input text been sent to SpeakText instead. All current mode settings are applied to the converted speech. No callbacks are generated while the TextToPhonemes routine is generating its output.RESULT CODESnoErr    0    No error    paramErr    –50    Parameter value is invalid    nilHandleErr    –109    Handle argument is nil    siUnknownInfoType    –231    Feature not implemented on synthesizer    invalidComponentID    –3000    Invalid SpeechChannel parameter    Getting Information About a Speech ChannelSeveral additional types of information have been made available for advanced users of the Speech Manager. This information provides more detailed status information for each channel. You can get this information by calling the GetSpeechInfo routine. This function accepts selectors that determine the type of information you want to get.NoteThroughout this document, there are several references to parameter values specified with fixed-point integer values (pbas, pmod, rate, and volm). Unless otherwise stated, the full range of values of the Fixed data type is valid. However, it is left to the individual speech synthesizer implementation to determine whether or not to use the full resolution and range of the Fixed data type. In the event a specified parameter value lies outside the range supported by a particular synthesizer, the synthesizer will substitute the value closest to the specified value that does lie within its performance specifications.uGetSpeechInfoThe GetSpeechInfo routine returns information about a designated speech channel.pascal OSErr GetSpeechInfo (SpeechChannel chan, OSType selector,                                     void *speechInfo);enum {soStatus                        = 'stat',                // gets speech output status soErrors                        = 'erro',                // gets error status soInputMode                        = 'inpt',                // gets current text/phon mode soCharacterMode                        = 'char',                // gets current character mode soNumberMode                        = 'nmbr',                // gets current number mode soRate                        = 'rate',                // gets current speaking rate soPitchBase                        = 'pbas',                // gets current baseline pitch soPitchMod                        = 'pmod',                // gets current pitch modulation soVolume                         = 'volm',                // gets current speaking volume soSynthType                        = 'vers',                // gets speech synth version info soRecentSync                        = 'sync',                // gets most recent sync message info soPhonemeSymbols                        = 'phsy',                 // gets phoneme symbols & ex. words soSynthExtension                        = 'xtnd'                // gets synthesizer-specific info };Field descriptionschan    Specific speech channelselector    Used to specify data being requested*speechInfo    Pointer to an information structureDESCRIPTIONThe following list of selectors describes the various types of information that can be obtained from the Speech Manager. The format of the information returned depends on which value is used in the selector field, as follows:NoteFor future code compatibility, use the application programming interface (API) labels instead of literal selector values.uField descriptionsstat    Gets various items of status information for the specified channel. Indicates whether any speech audio is being generated, whether or not the channel has paused, how many bytes in the input text have yet to be processed, and the phoneme code for the phoneme that is currently being generated. If inputBytesLeft is 0, the input buffer is no longer needed and can be disposed of. The API label for this selector is soStatus.                        typedef SpeechStatusInfo *speechInfo;                    typedef struct SpeechStatusInfo {                        Boolean            outputBusy;                     // true = audio playing                         Boolean            ouputPaused;                    // true = channel paused                         long            inputBytesLeft;                    // bytes left to process                         short            phonemeCode;                    // current phoneme code                         } SpeechStatusInfo;erro    Gets saved error information and clears the error registers. This selector lets you poll for various run-time errors that occur during speaking, such as the detection of badly formed embedded commands. Errors returned directly by Speech Manager routines are not reported here. The count field shows how many errors have occurred since the last check. If count is 0 or 1, then oldest and newest will be the same. Otherwise, oldest contains the error code for the oldest unread error and newest contains the error code for the most recent error. Both oldPos and newPos contain the character positions of their respective errors in the original input text buffer. The API label for this selector is soErrors.                        typedef SpeechErrorInfo *speechInfo;                    typedef struct SpeechErrorInfo {                        short            count;             // # of errs since last check                         OSErr            oldest;            // oldest unread error                         long            oldPos;            // char position of oldest err                        OSErr            newest;            // most recent error                         long            newPos;            // char position of newest err                    } SpeechErrorInfo;inpt    Gets the current value of the text processing mode control. The returned value specifies whether the specified speech channel is currently in text-input mode (TEXT) or phoneme-input mode (PHON). The API label for this selector is soInputMode.                        typedef OSType *speechInfo;                                        // TEXT or PHONchar    Gets the current value of the character processing mode control. The returned value specifies whether the specified speech channel is currently processing input characters in normal mode (NORM) or in literal, letter-by-letter, mode (LTRL). The API label for this selector is soCharacterMode.                        typedef OSType *speechInfo;    // NORM or LTRL nmbr    Gets the current value of the number processing mode control. The returned value specifies whether the specified speech channel is currently processing input character digits in normal mode (NORM) or in literal, digit-by-digit, mode (LTRL). The API label for this selector is soNumberMode.                    typedef OSType *speechInfo;    // NORM or LTRL rate    Gets the current speaking rate in words per minute on the specified channel. Speaking rates are fixed-point values. The API label for this selector is soRate.                    typedef Fixed *speechInfo;NoteWords per minute is a convenient, if difficult to define, way of representing speaking rate. Although there is no universally accepted definition of words per minute, it does communicate approximate information about speaking rates. Any specific rate may correspond to different rates on different synthesizers, but the two rates should be reasonably close. More importantly, doubling the rate on a particular synthesizer should halve the time needed to speak any particular utterance.upbas    Gets the current baseline pitch for the specified channel. The pitch value is a fixed-point integer that conforms to the following frequency relationship:                     Hertz = 440.0 * 2((BasePitch - 69) / 12)                    BasePitch of 1.0                            ≈    9 Hertz                    BasePitch of 39.5                            ≈    80 Hertz                    BasePitch of 45.8                            ≈    115 Hertz                    BasePitch of 50.4                            ≈    150 Hertz                    BasePitch of 100.0                            ≈    2637 HertzBasePitch values are always positive numbers in the range from 1.0 through 100.0. The API label for this selector is soPitchBase.                    typedef Fixed *speechInfo;pmod    Gets the current pitch modulation range for the speech channel. Modulation values range from 0.0 through 100.0. A value of 0.0 corresponds to no modulation and means the channel will speak in a monotone. The API label for this selector is soPitchMod.     Nonzero modulation values correspond to pitch and frequency deviations according to the following formula:                     Maximum pitch = BasePitch + PitchMod                    Minimum pitch = BasePitch - PitchMod                    Maximum Hertz = BaseHertz * 2(+ ModValue / 12)                    Minimum Hertz = BaseHertz * 2(- ModValue / 12)                    Given:                        BasePitch of 46.0                                (≈     115 Hertz),                        PitchMod of 2.0,                    Then:                        Maximum pitch     = 48.0                            (≈131 Hertz),                        Minimum pitch     = 44.0                            (≈104 Hertz)                    typedef Fixed *speechInfo;volm    Gets the current setting of the volume control on the specified channel. Volumes are expressed in fixed-point units ranging from 0.0 through 1.0. A value of 0.0 corresponds to silence, and a value of 1.0 corresponds to the maximum possible volume. Volume units lie on a scale that is linear with amplitude or voltage. A doubling of perceived loudness corresponds to a doubling of the volume. The API label for this selector is soVolume.                    typedef Fixed *speechInfo;vers    Gets descriptive information for the type of speech synthesizer being used on the specified speech channel. The API label for this selector is soSynthType.                    typedef SpeechVersionInfo *speechInfo;                    typedef struct SpeechVersionInfo {                        OSType            synthType;                        // always 'ttsc'                         OSType            synthSubType;                        // synth flavor                         OSType            synthManufacturer;    // synth creator                         long            synthFlags;                        // reserved                         NumVersion             synthVersion;                         // synth version                     } SpeechVersionInfo;sync    Returns the sync message code for the most recently encountered embedded sync command at the audio output point. If no sync command has been encountered, 0 is returned. Refer to the section “Embedded Speech Commands,” later in this document, for information about sync commands. The API label for this selector is soRecentSync.                    typedef OSType *speechInfo;phsy    Returns a list of phoneme symbols and example words defined for the current synthesizer. The input parameter is the address of a handle variable. On return, the PhonemeDescriptor parameter contains a handle to the array of phoneme definitions. Make sure to dispose of the handle when you are done using it. This information is normally used to indicate to the user the approximate sounds corresponding to various phonemes—an important feature in international speech. The API label for this selector is soPhonemeSymbols.                    typedef PhonemeDescriptor ***speechInfo; // VAR                                                                         Handle                     typedef struct PhonemeInfo {                        short        opcode;            // opcode for the phoneme                         Str15        phStr;            // corresponding char string                         Str31        exampleStr;                     // word that shows use of                                                    // phoneme                         short        hiliteStart;                    // part of example word                                                     //    to be hilighted as in                         short        hiliteEnd;                    // TextEdit selections                     } PhonemeInfo;                    typedef struct PhonemeDescriptor {                        short                phonemeCount;                      // # of elements                         PhonemeInfo                thePhonemes[1];                     // element list                     } PhonemeDescriptor;xtnd    This call supports a general method for extending the functionality of the Speech Manager. It is used to get synthesizer-specific information. The format of the returned data is determined by the specific synthesizer queried. The speechInfo argument should be a pointer to the proper data structure. If a particular synthCreator value is not recognized by the synthesizer, the command is ignored and the siUnknownInfoType code is returned. The API label for this selector is soSynthExtension.                    typedef SpeechXtndData *speechInfo;                    typedef struct SpeechXtndData {                        OSType            synthCreator;     // synth creator ID                         Byte            synthData[2];     // data TBD by synth                     } SpeechXtndData;RESULT CODESnoErr    0    No error    siUnknownInfoType    –231    Feature is not implemented on synthesizer    invalidComponentID    –3000    Invalid SpeechChannel parameter    Advanced Control RoutinesThe Speech Manager provides numerous control features for sophisticated developers. These controls enable you to set various speaking parameters programmatically and provide a rich set of callback routines that can be used to notify applications of various conditions within the speaking process.  They are extended by many speech synthesizers.These controls are accessed with the SetSpeechInfo routine. All calls to this routine expect a SpeechChannel parameter, a selector to indicate the desired function, and a pointer to some data. The format of this data depends on the particular selector and is documented in the following routine description.SetSpeechInfoThe SetSpeechInfo routine sets information for a designated speech channel.pascal OSErr SetSpeechInfo (SpeechChannel chan, OSType selector,     void *speechInfo);enum {                                                // Sets the parameter:     soInputMode                            = 'inpt',                // current text/phon mode     soCharacterMode                            = 'char',                // current character mode     soNumberMode                            = 'nmbr',                // current number mode     soRate                            = 'rate',                // current speaking rate     soPitchBase                            = 'pbas',                // current baseline pitch     soPitchMod                            = 'pmod',                // current pitch modulation     soVolume                             = 'volm',                // current speaking volume     soCurrentVoice                            = 'cvox',                // current speaking voice     soCommandDelimiter                            = 'dlim',                // command delimiters     soReset                            = 'rset',                // re channel to default state     soCurrentA5                            = 'myA5',                // app's A5 on callbacks     soRefCon                            = 'refc',                // reference constant     soTextDoneCallBack                            = 'tdcb',                // text done callback proc     soSpeechDoneCallBack                            = 'sdcb',                // end-of-speech callback proc     soSyncCallBack                            = 'sycb',                // sync command callback proc     soErrorCallBack                            = 'ercb',                // error callback proc     soPhonemeCallBack                            = 'phcb',                // phoneme callback proc     soWordCallBack                            = 'wdcb',                // word callback proc     soSynthExtension                            = 'xtnd'                // synthesizer-specific info };Field descriptionschan    Specific speech channelselector    Used to specify data being requested*speechInfo    Pointer to an information structureDESCRIPTIONThe following list of selectors outlines the controls available with the Speech Manager. The format of the information returned depends on which value is used in the selector field, as follows:NoteThe Speech Manager supports several callback features that can provide the sophisticated developer with a tight coupling to the speech synthesis process. However, these callbacks must be used carefully. Each is invoked from interrupt level. This means that you may not perform any operations that might cause memory to be allocated, purged, or moved. Although application global variables are also ordinarily not accessible at interrupt time, the soCurrentA5 myA5 selector described in the following text can be used to ask the Speech Manager to point register A5 at your application’s global variables prior to each callback. This makes it fairly painless to access global variables from your callback handlers. If this information worries you, don’t despair. Most information available through callbacks is also available through a GetSpeechInfo call. These calls are more friendly and do not come with the constraints imposed upon callback code. The only drawback is that if you do not poll the information you are interested in often enough, you may miss some of the changes in your speech channel’s status.uField descriptionsinpt    Sets the current value of the text processing mode control. The passed value specifies whether the speech channel should be in text-input mode (TEXT) or phoneme-input mode (PHON). Input mode changes take effect as soon as possible; however, the precise latency is dependent upon the specific speech synthesizer. The API label for this selector is soInputMode.                    typedef OSType *speechInfo;     // TEXT or PHON char    Sets the current value of the character processing mode control. The passed value specifies whether the speech channel should be in normal character processing mode (NORM) or literal, letter-by-letter, mode (LTRL). Character mode changes take effect as soon as possible; however, the precise latency is dependent upon the specific speech synthesizer. The API label for this selector is soCharacterMode.                    typedef OSType *speechInfo;     // NORM or LTRL nmbr    Sets the current value of the number processing mode control. The passed value specifies whether the specified speech channel should be in normal number processing mode (NORM) or in literal, digit-by-digit, mode (LTRL). The number mode changes take effect as soon as possible. However, the precise latency is dependent upon the specific speech synthesizer. The API label for this selector is soNumberMode.                    typedef OSType *speechInfo;     // NORM or LTRL rate    Sets the speaking rate in words per minute on the specified channel. Speaking rates are fixed-point values. All values are valid; however, specific synthesizers will not necessarily be able to speak at all possible rates. The API label for this selector is soRate.                    typedef Fixed *speechInfo;pbas    Changes the current baseline pitch for the specified channel. The pitch value is a fixed-point integer that conforms to the following frequency relationship:                    Hertz = 440.0 * 2((BasePitch - 69) / 12)                    BasePitch of 1.0                            ≈    9 Hertz                    BasePitch of 39.5                            ≈    80 Hertz                    BasePitch of 45.8                            ≈     115 Hertz                    BasePitch of 50.4                            ≈    150 Hertz                    BasePitch of 100.0                            ≈    2637 Hertz    BasePitch values are always positive numbers in the range from 1.0 through 100.0.                    typedef Fixed *speechInfo;    The API label for this selector is soPitchBase.pmod    Changes the current pitch modulation range for the speech channel. Modulation values range from 0.0 through 100.0. A value of 0.0 corresponds to no modulation and means the channel will speak in a monotone. Nonzero modulation values correspond to pitch and frequency deviations according to the following formula:                    Maximum pitch                    = BasePitch + PitchMod                    Minimum pitch                    = BasePitch - PitchMod                    Maximum Hertz                    = BaseHertz * 2(+ ModValue / 12)                    Minimum Hertz  = BaseHertz * 2(- ModValue / 12)                    Given :                         BasePitch of 46.0                            (≈115 Hertz),                        PitchMod of 2.0,                    Then:                        Maximum pitch         = 48.0                    (≈131 Hertz),                        Minimum pitch     = 46.0                        (≈104 Hertz)                    typedef Fixed *speechInfo;    The API label for this selector is soPitchMod.volm    Changes the current speaking volume on the specified channel. Volumes are expressed in fixed-point units ranging from 0.0 through 1.0 . A value of 0.0 corresponds to silence, and a value of 1.0 corresponds to the maximum possible volume. Volume units lie on a scale that is linear with amplitude or voltage. A doubling of perceived loudness corresponds to a doubling of the volume. The API label for this selector is soVolume.                    typedef Fixed *speechInfo;cvox    Changes the current voice on the current speech channel to the specified voice. Note that this control call will return an incompatibleVoice error if the specified voice is incompatible with the speech synthesizer associated with the speech channel. The API label for this selector is soCurrentVoice.                    typedef VoiceSpec *speechInfo;dlim    Sets the delimiter character strings for embedded commands. The start of an embedded command is determined by comparing the input characters to the start-command delimiter string. Likewise, the end of a command is determined by comparing the input characters to the end-command delimiter string. Command delimiter strings are either 1 or 2 bytes in length. If a single byte delimiter is desired, it should be followed by a null (0) byte. Delimiter characters must come from the set of printable characters. If the delimiter strings are empty, this will have the effect of disabling embedded command processing. Care must be taken not to choose delimiter strings that might occur naturally in the text to be spoken. The API label for this selector is soCommandDelimiter.                    typedef             DelimiterInfo *speechInfo;                    typedef             struct DelimiterInfo {                    Byte             startDelimiter[2];                             // defaults to "[["                     Byte             endDelimiter[2];                            // defaults to "]]"                     } DelimiterInfo;rset    Resets the speech channel to its default states. The speechInfo parameter should be set to 0. Specific synthesizers may provide other reset capabilities. The API label for this selector is soReset.                    typedef long *speechInfo;myA5    An application uses this selector to request that the speech synthesizer set up an A5 world prior to all callbacks. In order for an application to access any of its global data, it is necessary that register A5 contain the correct value, since all global variables are referenced relative to register A5. If you pass a non-null value in the speechInfo parameter, the speech synthesizer will set register A5 to this value just before it calls one of your callback routines. The A5 register is restored to its original value when your callback routine returns. The API label for this selector is soCurrentA5.                    typedef Ptr speechInfo;    A typical application would make the call to SetSpeechInfo with code like the following:                    myA5 = SetCurrentA5();                    err = SetSpeechInfo (mySpeechChannel, soCurrentA5,                             myA5);refc    Sets the reference constant associated with the specified channel. All callbacks generated for this channel will return this reference constant for use by the application. The application can use this value any way it wants to. The API label for this selector is soRefCon.                    typedef long *speechInfo;tdcb    Enables the callback that signals that text input processing is done. Your callback routine is invoked when the current buffer of input text has been processed and is no longer needed by the speech synthesizer. This callback does not indicate that the synthesizer is finished speaking the text (see the sdcb callback description, next), merely that the input text has been fully processed and is no longer needed by the speech synthesizer. This callback can be disabled by passing a null ProcPtr in the speechInfo parameter. When your callback routine is invoked, you have two options. If you set the nextBuf, byteLen, and controlFlags variables before returning, you will enable the speech synthesizer to continue speaking without any interruption in the output. If you set the nextBuf parameter to null, you are indicating that you have no more text to speak. The controlFlags parameter is defined as in SpeakBuffer. The API label for this selector is soTextDoneCallBack.                    typedef Ptr speechInfo;                    pascal void MyInputDoneCallback (SpeechChannel                         chan, long refCon, Ptr *nextBuf,                         long *byteLen, long *controlFlags);sdcb    Enables an end-of-speech callback. Your callback routine is called whenever an input text stream has been completely processed and spoken. When your callback routine is invoked, you can be certain that the speech channel is now idle and no audio is being generated. This callback can be disabled by passing a null ProcPtr in the speechInfo parameter. The API label for this selector is soSpeechDoneCallBack.                    typedef Ptr speechInfo;                    pascal void MyEndOfSpeechCallback (SpeechChannel                         chan, long refCon);sycb    Enables the sync command callback. Your callback routine is invoked when the text following a sync embedded command is about to be spoken. This callback can be disabled by passing a null ProcPtr in the speechInfo parameter. See “Embedded Speech Commands,” later in this document, for a description of how to use sync commands. The API label for this selector is soSyncCallBack.                    typedef Ptr speechInfo;                    pascal void MySyncCommandCallback (SpeechChannel                         chan, long refCon, OSType syncMessage);ercb    Enables error callbacks. Your callback routine is called whenever an error occurs during the processing of an input text stream. Errors can result from syntax problems in the input text, insufficient CPU processing speed (such as an audio data underrun), or other conditions that may arise during the speech conversion process. If error callbacks have not been enabled, when an error condition is detected, the Speech Manager will save its value. The error codes can then be read using the GetSpeechInfo status selector soErrors (erro). The error callback can be disabled by passing a null ProcPtr in the speechInfo parameter. The API label for this selector is soErrorCallBack.                    typedef Ptr speechInfo;                    pascal void MyErrorCallback (SpeechChannel chan,                         long refCon, OSErr error, long bytePos);phcb    Enables phoneme callbacks. Your callback routine is invoked for each phoneme generated by the speech synthesizer just before the phoneme is actually spoken. This callback can be disabled by passing a null ProcPtr in the speechInfo parameter. The API label for this selector is soPhonemeCallBack.                    typedef Ptr speechInfo;                    pascal void MyPhonemeCallBack (SpeechChannel chan,                         long refCon, short phonemeOpcode);wdcb    Enables word callbacks. Your callback routine is invoked for each word generated by the speech synthesizer just before the word is actually spoken. This callback can be disabled by passing a nil ProcPtr in the speechInfo parameter. The API label for this selector is soWordCallBack.                    typedef Ptr speechInfo;                    pascal void MyWordCallback (SpeechChannel chan,                         long refCon, long wordPos, short wordLen);xtnd    This call supports a general method for extending the functionality of the Speech Manager. It is used to set synthesizer-specific information. The speechInfo argument should be a pointer to the appropriate data structure. If a particular synthCreator value is not recognized by the synthesizer, the command is ignored and an siUnknownInfoType code is returned. The API label for this selector is soSynthExtension.                    typedef SpeechXtndData *speechInfo;                    typedef struct SpeechXtndData {                        OSType            synthCreator;             // synth creator ID                         Byte            synthData[2];     // data TBD by synth                     } SpeechXtndData;RESULT CODESnoErr    0    No error    paramErr    –50    Parameter value is invalid    siUnknownInfoType    –231    Feature is not implemented on synthesizer    incompatibleVoice    –245    Specified voice cannot be used with synthesizer    invalidComponentID    –3000    Invalid SpeechChannel parameter    Application-Defined Pronunciation DictionariesNo matter how sophisticated a speech synthesis system is, there will always be words that it does not automatically pronounce correctly. The clearest instance of words that are often mispronounced is the class of proper names (names of people, place names, and so on). One way to get around this fundamental limitation is to use a dictionary of pronunciations. Whenever a speech synthesizer needs to determine the proper phonemic representation for a particular word, it first looks for the word in its dictionaries. Pronunciation dictionary entries contain information that enables precise conversion between text and the correct phoneme codes. They also provide stress, intonation, and other information to help speech synthesizers produce more natural speech. If the word in question is found in the dictionary, then the synthesizer uses the information from the dictionary entry rather than relying on its own letter-to-sound rules. The use of phonemes is described in “Summary of Phonemes and Prosodic Controls,” later in this document.The Speech Manager word storage format provides high-quality data that is interchangeable between speech synthesizers. The Speech Manager also uses an easily extensible dictionary structure that does not affect the usability of existing dictionaries.It is assumed that application-defined pronunciation dictionaries will reside in RAM when in use. The run-time structure of dictionary data presumably depends on the specific needs of particular speech synthesizers and will therefore differ from the structure of the dictionaries as stored on disk.Associating a Dictionary With a Speech ChannelThe following routines can be used to associate an application-defined pronunciation dictionary with a particular speech channel.UseDictionaryThe UseDictionary routine associates a designated dictionary with a specific speech channel.pascal OSErr UseDictionary (SpeechChannel chan, Handle         dictionary);Field descriptionschan    Specific speech channeldictionary    Handle to the specified dictionaryDESCRIPTIONThe speech synthesizer will attempt to use the dictionary data pointed to by the dictionary handle argument to augment the built-in pronunciation rules on the specified speech channel. The synthesizer will use whatever elements of the dictionary resource it considers useful to the speech conversion process. After returning from UseDictionary, the caller is free to release any storage allocated for the dictionary handle. The search order for application-provided dictionaries is last in, first searched.All details of how an application-provided dictionary is represented within the speech synthesizer are dependent on the specific synthesizer implementation and are totally private to the synthesizer.RESULT CODESnoErr    0    No error    memFullErr    –108    Not enough memory to use new dictionary    badDictFormat    –246    Format problem with pronunciation dictionary    invalidComponentID    –3000    Invalid SpeechChannel parameter    Pronunciation Dictionary Data FormatEach application-defined pronunciation dictionary is implemented as a single resource of type 'dict'. To read the dictionary contents, the system first reads the resource into memory using Resource Manager routines.An application dictionary contains the following information:total byte length    (long)    (Length is all-inclusive)    atom type    (long)        format version    (long)        script code    (short)        language code    (short)        region code    (short)        date last modified    (long)    (Seconds since January 1, 1904)    reserved(4)    (long)        entry count    (long)        list of entries            The currently defined atom type is'dict '    Æ    Dictionary    Each entry consists of the following:entry byte length    (short)    (Length is all-inclusive)    entry type    (short)        field count    (short)        list of fields            The currently defined entry types are the following:0x00    Æ    Null entry    0x01 to 0x20    Æ    Reserved    0x21    Æ    Pronunciation entry    0x22    Æ    Abbreviation entry    Each field consists of the following:field byte length    (short)    (Length is all-inclusive minus padding)    field type    (short)        field data    (char[])    (Data is padded to word boundary)    The currently defined field types are the following:0x00    Æ    Null field    0x01 to 0x20    Æ    Reserved    0x21    Æ    Word represented in textual format.    0x22    Æ    Phonemic pronunciation including a complete set of syllable, lexical stress, word prominence, and prosodic markers represented in textual format    0x23    Æ    Part-of-speech code    Creating and Editing DictionariesThere is no built-in support for creating and editing speech dictionaries. You can create dictionary resources using any of the available resource editing tools such as the MPW Rez tool or ResEdit. Of course, you can also fairly easily develop routines to edit the dictionary structure from within the application. At the present time, no assumption should be made that the entries in a dictionary are stored in sorted order.Advanced Voice Information RoutinesOrdinarily, an application should need to use only the GetVoiceDescription routine to access information about a particular voice. Occasionally, however, it may be necessary to obtain more detailed information by using the GetVoiceInfo routine.GetVoiceInfoThe GetVoiceInfo routine returns information about a specified voice channel beyond that obtainable through the GetVoiceDescription routine.pascal OSErr GetVoiceInfo (VoiceSpec *voice, OSType selector,     void *voiceInfo);    typedef VoiceDescription *voiceInfo;    typedef VoiceFileInfo *voiceInfo;    typedef struct VoiceFileInfo {    FSSpec            fileSpec;                // vol, dir, name info for voice file     short            resID;                // resource ID of voice in the file } VoiceFileInfo;enum {    soVoiceDescription                            = 'info',                // gets basic voice info     soVoiceFile                            = 'fref'                // gets voice file ref info };Field descriptions*voice    Specific speech channelselector    Used to specify data being requested*voiceInfo    Pointer to an information structureDESCRIPTIONThis function accepts selectors that determine the type of information you want to get. The format of the information returned depends on which value is used in the selector field, as follows:Field descriptionsinfo    Gets basic information for the specified voice. The structure returned is functionally equivalent to the VoiceDescription data structure in GetVoiceDescription, described earlier in this document. To maximize compatibility with future versions of the Speech Manager, the application must set the length field of the VoiceDescription structure to the size of the existing record before calling GetVoiceInfo, which then returns the size of the new record.fref    Gets file reference information for specified voice; normally only used by speech synthesizers to access voice disk files directly.RESULT CODESnoErr    0    No error    memFullErr    –108    Not enough memory to load voice into memory    voiceNotFound    –244    Voice resource not found    Embedded Speech CommandsThis section describes how you can insert commands directly into the input text to control or modify the spoken output. When processing input text data, speech synthesizers look for special sequences of characters called delimiters. These character sequences are usually defined to be unusual pairings of printable characters that would not normally appear in the text. When a begin command delimiter string is encountered in the text, the following characters are assumed to contain one or more commands. The synthesizer will attempt to parse and process these commands until an end command delimiter string is encountered.Embedded Speech Command SyntaxBy default, the begin command and end command delimiters are defined to be [[ and ]]. The syntax of embedded command blocks is given below, according to these rules: n    Items enclosed in angle brackets (< and >) represent logical units that are either defined further below or are atomic units that should be self-explanatory. n    Items enclosed in brackets are optional. n    Items followed by an ellipsis (…) may be repeated one or more times. n    For items separated by a vertical bar (|), any one of the listed items may be used. n    Multiple space characters between tokens may be used if desired. n    Multiple commands should be separated by semicolons.All other characters that are not enclosed between angle brackets must be entered literally. There is no limit to the number of commands that can be included in a single command block.Identifier    Syntax    CommandBlock    <BeginDelimiter> <CommandList> <EndDelimiter>    BeginDelimiter    <String1> | <String2>    EndDelimiter    <String1> | <String2>    CommandList     <Command> [; <Command>]…    Command     <CommandSelector> [Parameter]…    CommandSelector    <OSType>    Parameter    <OSType> | <String1> | <String2> | <StringN> | <FixedPointValue> |<32BitValue> | <16BitValue> | <8BitValue>    String1    <QuoteChar> <Character> <QuoteChar>    String2    <QuoteChar> <Character> <Character> <QuoteChar>    StringN    <QuoteChar> [<Character>]… <QuoteChar>    QuoteChar    " | '    OSType    <4 character pattern (e.g., RATE, vers, aBcD)>    Character    <Any printable character (example A, b, *, #, x)>    FixedPointValue    <Decimal number: 0.0000 £ N £ 65535.9999>    32BitValue    <OSType> | <LongInt> | <HexLongInt>    16BitValue    <Integer> | <HexInteger>    8BitValue    <Byte> | <HexByte>    LongInt    <Decimal number: 0 £ N £ 4294967295>    HexLongInt    <Hex number: 0x00000000 £ N £ 0xFFFFFFFF>    Integer    <Decimal number: 0 £ N £ 65535>        (continued)    HexInteger    <Hex number: 0x0000 £ N £ 0xFFFF>    Byte    <Decimal number: 0 £ N £ 255>    HexByte    <Hex number: 0x00 £ N £ 0xFF>    Here is the embedded command syntax structure:Embedded Speech Command SetTable 1-1 outlines the set of currently defined embedded speech commands.Table 1-1    Embedded speech commands(continued)Command    Selector    Command syntax and description    Version    vers    vers <Version>Version::= <32BitValue>This command informs the synthesizer of the format version that will be used in subsequent commands. This command is optional but is highly recommended. The current version is 1.    Delimiter    dlim    dlim <BeginDelimiter> <EndDelimiter>The delimiter command specifies the character sequences that mark the beginning and end of all subsequent commands. The new delimiters take effect at the end of the current command block. If the delimiter strings are empty, an error is generated. (Contrast this behavior with the dlim function of SetSpeechInfo.)    Comment    cmnt    cmnt [Character]…This command enables a developer to insert a comment into a text stream for documentation purposes. Note that all characters following the cmnt selector up to the <EndDelimiter> are part of the comment.    Reset    rset    rset <32BitValue>The reset command will reset the speech channel’s settings back to the default values. The parameter should be set to 0.            (continued)    Baseline pitch    pbas    pbas [+ | -] <Pitch>Pitch ::= <FixedPointValue>The baseline pitch command changes the current pitch for the speech channel. The pitch value is a fixed-point number in the range 1.0 through 100.0 that conforms to the frequency relationship Hertz = 440.0 * 2((Pitch – 69) / 12)If the pitch number is preceded by a + or – character, the baseline pitch is adjusted relative to its current value. Pitch values are always positive numbers. For further details, see “SetSpeechInfo,” earlier in this document.    Pitch modulation    pmod    pmod [+ | -] <ModulationDepth>ModulationDepth ::= <FixedPointValue>The pitch modulation command changes the modulation range for the speech channel. The modulation value is a fixed-point number in the range 0.0 through 100.0 that conforms to the following pitch and frequency relationships:Maximum pitch = BasePitch + PitchModMinimum pitch = BasePitch - PitchModMaximum Hertz = BaseHertz * 2(+ ModValue / 12)Minimum Hertz = BaseHertz * 2(– ModValue / 12)A value of 0.0 corresponds to no modulation and will cause the speech channel to speak in a monotone. If the modulation depth number is preceded by a + or – character, the pitch modulation is adjusted relative to its current value. For further details, see “SetSpeechInfo,” earlier in this document.    Speaking rate    rate    rate [+ | -] <WordsPerMinute>WordsPerMinute ::= <FixedPointValue>The speaking rate command sets the speaking rate in words per minute on the speech channel. If the rate value is preceded by a + or – character, the speaking rate is adjusted relative to its current value.            (continued)    Volume    volm    volm [+ | -] <Volume>Volume::= <FixedPointValue>The volume command changes the speaking volume on the speech channel. Volumes are expressed in fixed-point units ranging from 0.0 through 1.0 . A value of 0.0 corresponds to silence, and a value of 1.0 corresponds to the maximum possible volume. Volume units lie on a scale that is linear with amplitude or voltage. A doubling of perceived loudness corresponds to a doubling of the volume.    Sync    sync    sync <SyncMessage>SyncMessage::= <32BitValue>The sync command causes a callback to the application’s sync command callback routine. The callback is made when the audio corresponding to the next word begins to sound. The callback routine is passed the SyncMessage value from the command. If the callback routine has not been defined, the command is ignored. For further details, see “SetSpeechInfo,” earlier in this document.    Input mode    inpt    inpt TX | TEXT | PH | PHONThis command switches the input processing mode to either normal text mode or raw phoneme mode.    Character mode    char    char NORM | LTRLThe character mode command sets the word speaking mode of the speech synthesizer. When NORM mode is selected, the synthesizer attempts to automatically convert words into speech. This is the most basic function of the text-to-speech synthesizer. When LTRL mode is selected, the synthesizer speaks every word, number, and symbol letter by letter. Embedded command processing continues to function normally, however.    Number mode    nmbr    nmbr NORM | LTRLThe number mode command sets the number speaking mode of the speech synthesizer. When NORM mode is selected, the synthesizer attempts to automatically speak numeric strings as intelligently as possible. When LTRL mode is selected, numeric strings are spoken digit by digit.            (continued)      Silence    slnc    slnc <Milliseconds>Milliseconds ::= <32BitValue>The silence command causes the synthesizer to generate silence for the specified amount of time.    Emphasis    emph    emph + | -The emphasis command causes the next word to be spoken with either greater emphasis or less emphasis than would normally be used. Using + will force added emphasis, while using – will force reduced emphasis.    Synthesizer-Specific    xtnd    xtnd <SynthCreator> [parameter]SynthCreator ::= <OSType>The extension command enables synthesizer-specific commands to be embedded in the input text stream. The format of the data following SynthCreator is entirely dependent on the synthesizer being used. If a particular SynthCreator is not recognized by the synthesizer, the command is ignored but no error is generated.    Synthesizers often support embedded commands that extend the set given in Table 1-1. Embedded Speech Command Error ReportingWhile embedded speech commands are being processed, several types of errors may be detected and reported to your application. If you have set up an error callback handler with the soErrorCallBack selector of the SetSpeechInfo routine (described earlier), you will be notified once for every error that is detected. If you have not enabled error callbacks, you can still obtain information about the errors encountered by calling GetSpeechInfo with the soErrors selector (also described earlier). The following errors are detected during processing of embedded speech commands:badParmVal    –245    Parameter value is invalid    badCmdText    –246    Embedded command syntax or parameter problem    unimplCmd    –247    Embedded command is not implemented on synthesizer    unimplMsg    –248    Raw phoneme text contains invalid characters    badVoiceID    –250    Specified voice has not been preloaded    badParmCount    –252    Incorrect number of embedded command arguments found    Summary of Phonemes and Prosodic ControlsThis section summarizes the phonemes and prosodic controls used by American English speech synthesizers.Phoneme SetTable 1-2 summarizes the set of standard phonemes recognized by American English speech synthesizers.In this description, it is assumed that specific rules and markers apply only to general American English. Other languages and dialects require different phoneme inventories. Phonemes divide into two groups: vowels and consonants. All vowel symbols are uppercase pairs of letters. For consonants, in cases in which the correspondence between the consonant and its symbol is apparent, the symbol is that lowerrcase consonant; in other cases, the symbol is an uppercase consonant. Within the example words, the individual sounds being exemplified appear in bold face.Table 1-2    American English phoneme symbols(continued)Symbol    Example    Opcode    Symbol    Example    Opcode    AE    bat    2    b    bin    18    EY    bait    3    C    chin    19    AO    caught    4    d    din    20    AX    about    5    D    them    21    IY    beet    6    f    fin    22    EH    bet    7    g    gain    23    IH    bit    8    h    hat    24    AY    bite    9    J    gin    25    IX    roses    10    k    kin    26    AA    cot    11    l    limb    27    UW    boot    12    m    mat    28    UH    book    13    n    nat    29    UX    bud    14    N    tang    30    OW    boat    15    p    pin    31    AW    bout    16    r    ran    32    OY    boy    17    s    sin    33                S    shin    34                t    tin    35                T    thin    36                v    van    37                w    wet    38                    (continued)                    y    yet    39    %    silence    0    z    zen    40    @    breath intake    1    Z    genre    41    NoteThe “silence” phoneme (%) and the “breath” phoneme (@) may be lengthened or shortened like any other phoneme.uProsodic ControlsThe symbols listed in Table 1-3 are recognized as modifiers to the basic phonemes described in the preceding section. They can be used to more precisely control the quality of speech that is described in terms of raw phonemes.Table 1-3    Prosodic control symbols(continued)Type    Symbol        Description of effect        Lexical stress:            Marks stress within a word          Primary stress    1    anticipation    AEnt2IHsIXp1EYSAXn   (“anticipation”)          Secondary stress    2    anticipation            Syllable breaks:            Marks syllable breaks within a word          Syllable mark    =    (equal)    AEn=t2IH=sIX=p1EY=SAXn (“anticipation”)Marks the beginning of a word (required)        Word prominence:                      Unstressed    ~    (asciitilde)    Used for words with minimal information content          Normal stress    _    (underscore)    Used for information-bearing words          Emphatic stress    +    (plus)    special emphasis for a wordPlaced before the affected phonemepitch will rise on the following phoneme        Prosodic                      Pitch rise    /    (slash)              Pitch fall    \    (backslash)    pitch will fall on the following phoneme          Lengthen   phoneme    >    (greater)    lengthen the duration of the following phoneme          Shorten phoneme    <    (less)    shorten the duration of the following phoneme                        (continued)    Punctuation:            Pitch effect    Timing effect        .    (period)    Sentence final fall    Pause follows        ?    (question)    Sentence final rise    Pause follows        !    (exclam)    Sentence final sharp fall    Pause follows        …    (ellipsis)    Clause final level    Pause follows        ,    (comma)    Continuation rise    Short pause follows        ;    (semicolon)    Continuation rise     Short pause follows        :    (colon)    Clause final level     Short pause follows        (    (parenleft)    Start reduced range    Short pause precedes        )    (parenright)    End reduced range    Short pause follows        “‘    (quotedblleft, quotesingleleft)    Varies    Varies        ”’    (quotedblright, quotesingleright)    Varies    Varies        -    (hyphen)    Clause-final level    Short pause follows        &    (ampersand)    Forces no addition of silence between phonemes        Specific pitch contours associated with these punctuation marks may vary according to other considerations in the analysis of the text, such as whether a question is rhetorical or begins with a wh question word, so the above effects should be regarded only as guidelines and not absolute. This also applies to the timing effects, which will vary according to the current rate setting.The prosodic control symbols (/, \, <, and >) may be concatenated to provide more exaggerated, cumulative effects. The specific nature of the effect is dependent on the speech synthesizer. Speech synthesizers also often extend or enhance the controls described in this section. Summary of the Speech ManagerConstants#define gestaltSpeechAttr                                    'ttsc'        // Gestalt Manager selector for speech                                                 attributes enum { gestaltSpeechMgrPresent                                    = 0        // Gestalt bit that indicates that Speech                                                Manager exists };#define kTextToSpeechSynthType                                                    'ttsc'            // text-to-speech                                                                synthesizer component type #define kTextToSpeechVoiceType                                                    'ttvd'            // text-to-speech voice                                                                resource type #define kTextToSpeechVoiceFileType                                                    'ttvf'            // text-to-speech voice file                                                                type #define kTextToSpeechVoiceBundleType                                                    'ttvb'            // text-to-speech voice                                                                bundle file type enum {            // Speech Manager error codes (range from 240 - 259)     noSynthFound                            = -240,    synthOpenFailed                            = -241,    synthNotReady                            = -242,    bufTooSmall                            = -243,    voiceNotFound                            = -244,    incompatibleVoice                            = -245,    badDictFormat                            = -246,    badPhonemeText                            = -247};enum {                    // constants for SpeakBuffer and text done callback                     controlFlags bits     kNoEndingProsody                                = 1,    kNoSpeechInterrupt                                = 2,    kPreflightThenPause                                = 4};enum {                    // constants for StopSpeechAt and PauseSpeechAt     kImmediate                        = 0,    kEndOfWord                        = 1,    kEndOfSentence                        = 2};// GetSpeechInfo & SetSpeechInfo selectors #define soStatus                                        'stat'#define soErrors                                        'erro'#define soInputMode                                        'inpt'#define soCharacterMode                                        'char'#define soNumberMode                                        'nmbr'#define soRate                                        'rate'#define soPitchBase                                        'pbas'#define soPitchMod                                        'pmod'#define soVolume                                        'volm'#define soSynthType                                        'vers'#define soRecentSync                                        'sync'#define soPhonemeSymbols                                        'phsy'#define soCurrentVoice                                        'cvox'#define soCommandDelimiter                                        'dlim'#define soReset                                        'rset'#define soCurrentA5                                        'myA5'#define soRefCon                                        'refc'#define soTextDoneCallBack                                        'tdcb'#define soSpeechDoneCallBack                                        'sdcb'#define soSyncCallBack                                        'sycb'#define soErrorCallBack                                        'ercb'#define soPhonemeCallBack                                        'phcb'#define soWordCallBack                                        'wdcb'#define soSynthExtension                                        'xtnd'// speaking mode constants #define modeText                                'TEXT'     // input mode constants #define modeTX                                'TX'#define modePhonemes                                'PHON'#define modePH                                'PH'#define modeNormal                                'NORM'         // character mode and number mode constants #define modeLiteral                                'LTRL'enum {                                                // GetVoiceInfo selectors     soVoiceDescription                            = 'info',                // gets basic voice info     soVoiceFile                            = 'fref'                // gets voice file ref info };enum {kNeuter = 0, kMale, kFemale};                                                // returned in gender field below Data Typestypedef struct SpeechChannelRecord {    long data[1];} SpeechChannelRecord;typedef SpeechChannelRecord *SpeechChannel;typedef struct VoiceSpec {    OSType            creator;                // creator ID of required synthesizer     OSType            id;                // voice ID on the specified synth } VoiceSpec;typedef struct VoiceDescription {    long                length;                    // size of structure - set by application     VoiceSpec                voice;                    // voice creator and ID info     long                version;                    // version code for voice     Str63                name;                    // name of voice     Str255                comment;                    // additional text info about voice     short                gender;                    // neuter, male, or female     short                age;                    // approximate age in years     short                script;                    // script code of text voice can process     short                language;                    // language code of voice output     short                region;                    // region code of voice output     long                reserved[4];                    // reserved for future use } VoiceDescription;typedef struct VoiceFileInfo {    FSSpec            fileSpec;                // volume, dir, & name information for voice file     short            resID;                // resource ID of voice in the file } VoiceFileInfo;typedef struct SpeechStatusInfo {    Boolean            outputBusy;                        // true if audio is playing     Boolean            outputPaused;                        // true if channel is paused     long            inputBytesLeft;                        // bytes left to process     short            phonemeCode;                        // opcode for cur phoneme } SpeechStatusInfo;typedef struct SpeechErrorInfo {    short            count;            // # of errs since last check     OSErr            oldest;            // oldest unread error     long            oldPos;            // char position of oldest err     OSErr            newest;            // most recent error     long            newPos;            // char position of newest err } SpeechErrorInfo;typedef struct SpeechVersionInfo {    OSType                synthType;                            // always 'ttsc'     OSType                synthSubType;                            // synth flavor     OSType                synthManufacturer;                            // synth creator ID     long                synthFlags;                            // synth feature flags     NumVersion                synthVersion;                            // synth version number } SpeechVersionInfo;typedef struct PhonemeInfo {    short            opcode;                    // opcode for the phoneme     Str15            phStr;                    // corresponding char string     Str31            exampleStr;                    // word that shows use of phoneme     short            hiliteStart;                    // segment of example word that     short            hiliteEnd;                    //   hilighted text (ala TextEdit) } PhonemeInfo;typedef struct PhonemeDescriptor {    short                    phonemeCount;                        // # of elements     PhonemeInfo                    thePhonemes[1];                        // element list } PhonemeDescriptor;typedef struct SpeechXtndData {    OSType            synthCreator;                    // synth creator ID     Byte            synthData[2];                    // data TBD by synth } SpeechXtndData;typedef struct DelimiterInfo {    Byte            startDelimiter[2];                            // defaults to [[     Byte            endDelimiter[2];                            // defaults to ]] } DelimiterInfo;Voice Routinespascal OSErr MakeVoiceSpec (OSType creator, OSType id, VoiceSpec *voice);pascal OSErr CountVoices (short *numVoices);pascal OSErr GetIndVoice (short index, VoiceSpec *voice);pascal OSErr GetVoiceDescription (VoiceSpec *voice, VoiceDescription *info,     long infoLength);pascal OSErr GetVoiceInfo (VoiceSpec *voice, OSType selector, void     *voiceInfo);Routines for Managing Speech Channelspascal OSErr NewSpeechChannel (VoiceSpec *voice, SpeechChannel *chan);pascal OSErr DisposeSpeechChannel (SpeechChannel chan);Speaking Routinespascal OSErr SpeakString (StringPtr s);pascal OSErr SpeakText (SpeechChannel chan, Ptr textBuf, long textBytes);pascal OSErr StopSpeech (SpeechChannel chan);pascal OSErr StopSpeechAt (SpeechChannel chan, long whereToStop);pascal OSErr PauseSpeechAt (SpeechChannel chan, long whereToPause);pascal OSErr ContinueSpeech (SpeechChannel chan);pascal OSErr SpeakBuffer (SpeechChannel chan, Ptr textBuf, long textBytes,    long controlFlags);Information and Control Routinespascal NumVersion SpeechManagerVersion (void);pascal short SpeechBusy (void);pascal OSErr SetSpeechRate (SpeechChannel chan, Fixed rate);pascal OSErr GetSpeechRate (SpeechChannel chan, Fixed *rate);pascal OSErr SetSpeechPitch (SpeechChannel chan, Fixed pitch);pascal OSErr GetSpeechPitch (SpeechChannel chan, Fixed *pitch);pascal short SpeechBusySystemWide (void);pascal OSErr SetSpeechInfo (SpeechChannel chan, OSType selector, void     *speechInfo);pascal OSErr GetSpeechInfo (SpeechChannel chan, OSType selector, void     *speechInfo);Text-to-Phoneme Conversion Routinepascal OSErr TextToPhonemes (SpeechChannel chan, Ptr textBuf,     long textBytes, Handle phonemeBuf, long *phonemeBytes) Dictionary Management Routinepascal OSErr UseDictionary (SpeechChannel chan, Handle dictionary)Callback Prototypes        // text-done callback routine typedef typedef pascal void (*TextDoneProcPtr) (SpeechChannel, long, Ptr *, long *,         long *);        // speech-done callback routine typedef typedef pascal void (*SpeechDoneProcPtr) (SpeechChannel, long );        // sync callback routine typedef typedef pascal void (*SyncProcPtr) (SpeechChannel, long, OSType);        // error callback routine typedef typedef pascal void (*ErrorProcPtr) (SpeechChannel, long, OSErr, long);        // phoneme callback routine typedef typedef pascal void (*PhonemeProcPtr) (SpeechChannel, long, short);        // word callback routine typedef typedef pascal void (*WordProcPtr) (SpeechChannel, long, long, short);Error Return CodesnoErr    0    No error    paramErr    –50    Parameter error    memFullErr    –108    Not enough memory to speak    nilHandleErr    –109    Handle argument is nil    siUnknownInfoType    –231    Feature not implemented on synthesizer    noSynthFound    –240    Could not find the specified speech synthesizer    synthOpenFailed    –241    Could not open another speech synthesizer channel    synthNotReady    –242    Speech synthesizer is still busy speaking    bufTooSmall    –243    Output buffer is too small to hold result    voiceNotFound    –244    Voice resource not found    incompatibleVoice    –245    Specified voice cannot be used with synthesizer    badDictFormat    –246    Format problem with pronunciation dictionary    badPhonemeText    –247    Raw phoneme text contains invalid characters    invalidComponentID    –3000    Invalid SpeechChannel parameter    ö◊#ˇ ˇˇˇˇ#◊
  2. ˇ·ˇ‚ˆA
  3. 4π´Ÿ,     Helvetica.(Œ´©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc.
  4. X9˜4X9˜ Ò9Ò
  5. ˇ·ˇ‚ˆA, Palatinoˇˇu÷ˇÆ°dONLNd9´Vö(O´The Speech Managerˇˇˇˇˇˇä*(O˙1
  6. °dONLNd˙´%(´Speech Manager Overview ñ`°dONLNd,˙%')z `°dONLNd-˙(*) ñ`°dONLNd.˙*/)2°dONLNd0´"(´Speech Manager Concepts ¬°dONLNdH"$)w B°dONLNdI%') ¬°dONLNdJ',)3°dONLNdL´ #(´Using the Speech Manager S@°dONLNde$ &)y ”@°dONLNdf& () S@°dONLNdg) .)4°dONLNdi!µ-˙(*µGetting Started T‡°dONLNdy!˚-˝)F ‘‡°dONLNdz!˝-ˇ) T‡°dONLNd{!-)4°dONLNd}.ø:i(7ø%Determining If the Speech Manager Is Q¿°dONLNd¢.i:p)™A.°dONLNd£.p:ï)    vailable ^†°dONLNd¨.ï:ó)% fi†°dONLNd≠.ó:ô) ^†°dONLNdÆ.ö:ü)4°dONLNd∞;øGÂ(DøWhich V¿°dONLNd∑;ÂG°)&)ersion of the Speech Manager Is Running? º@°dONLNd‡;°G£)º <@°dONLNd·;§G¶) º@°dONLNd‚;¶G´)5°dONLNd‰HøT(QøMaking Some Noise SÄ°dONLNdˆHT)\ ”Ä°dONLNd˜HT) SÄ°dONLNd¯H T%)5°dONLNd˙Uøaf(^ø$Determining If Speaking Is Complete Æ °dONLNdUfah)ß . °dONLNdUiak) Æ °dONLNd Ukap)6°dONLNd"bønΔ(køA∫†°dONLNd#bΔn) Simple Example ∑`°dONLNd3bn)M 7`°dONLNd4bn) ∑`°dONLNd5bn)6°dONLNd7oµ{S(xµ"Essential Calls—Simple and Useful ó@°dONLNdYoS{U)û @°dONLNdZoV{X) ó@°dONLNd[oX{])7°dONLNd]|øà…(ÖøWï°dONLNd^|»àÒ)    orking W»Ä°dONLNdf|Òà))ith Va°dONLNdk|à)oices µ¿°dONLNdq|à ) 5¿°dONLNdr|!à#) µ¿°dONLNds|#à()7°dONLNduâøïè(íø,Managing Connections to Speech Synthesizers °@°dONLNd°âèïë)– !@°dONLNd¢âíïî) °@°dONLNd£âîïô)1†°dONLNd§âôïû)1°dONLNd¶ñø¢D(üøStarting and Stopping Speech »†°dONLNd√ñD¢F)Ö H†°dONLNdƒñG¢I) »†°dONLNd≈ñI¢S)13°dONLNd»£øØ0(¨øUsing Basic Speech ContrzÄ°dONLNd‡£0Ø?)qols ï`°dONLNd‰£?ØA) `°dONLNd£BØD) ï`°dONLNdÊ£DØN)14°dONLNdÈ∞øºÎ(πø Putting It †‡°dONLNdÙ∞κ),All TÓ†°dONLNd˘∞º$)ogether  ‡°dONLNd∞%º')% 凰dONLNd∞'º))  ‡°dONLNd∞*º4)17°dONLNdΩµ…(ΔµAdvanced Routines ]†°dONLNdΩ…)Z ›†°dONLNdΩ…) ]†°dONLNdΩ…)18°dONLNd ø÷*(”øAdvanced Speech Contr¨@°dONLNd2 *÷9)kols « °dONLNd6 9÷;) G °dONLNd7 <÷>) « °dONLNd8 >÷H)19°dONLNd;◊ø„˘(‡ø Converting TÅ`°dONLNdG◊˘„M):ext Into Phonemes „‡°dONLNdY◊M„O)T c‡°dONLNdZ◊P„R) „‡°dONLNd[◊R„\)23°dONLNd^‰ø(ÌøGetting Information ãÄ°dONLNdr‰â)[About a Speech Channel Ì@°dONLNdâ‰âã)o m@°dONLNdä‰åé) Ì@°dONLNdã‰éò)24°dONLNdéÒø˝(˙øAdvanced ContrÄ°dONLNdúÒ    ˝=)J ol Routines †¿°dONLNd®Ò=˝?)4  ¿°dONLNd©Ò@˝B) †¿°dONLNd™ÒB˝L)30°dONLNd≠˛ø
  7.     (øApplication-Defi†°dONLNdΩ˛    
  8. &)Jned PrΰdONLNd√˛&
  9. ï)onunciation Dictionaries =¿°dONLNd‹˛ñ
  10. ò)p Ω¿°dONLNd›˛ò
  11. ö) =¿°dONLNdfi˛õ
  12. •)36°dONLNd· ø8(øAssociating a Dictionary W@°dONLNd˚ 8ó)yith a Speech Channel g@°dONLNd óô)_ Á@°dONLNd ôõ) g@°dONLNd ú¶)37°dONLNdø$»(!øPrN†°dONLNd…$l)
  13. #onunciation Dictionary Data Format N¿°dONLNd:l$n)£ Œ¿°dONLNd;n$p) N¿°dONLNd<q${)38°dONLNd?%ø1 (.øCr\°dONLNdA% 1V)  eating and Editing Dictionaries ≤@°dONLNda%V1X)å 2@°dONLNdb%Y1[) ≤@°dONLNdc%[1e)39°dONLNdf2ø>ˆ(;ø
  14. Advanced VÆ°dONLNdp2ı>j)6oice Information Routines C@°dONLNdä2k>m)v √@°dONLNdã2m>o) C@°dONLNdå2p>z)39°dONLNdè?µK?(HµEmbedded Speech Commands ”@°dONLNd®??KA)ä S@°dONLNd©?BKD) ”@°dONLNd™?DKN)40°dONLNd≠LøXe(UøEmbedded Speech Command Syntax !Ä°dONLNdÃLfXh)ß °Ä°dONLNdÕLhXj) !Ä°dONLNdŒLkXu)41°dONLNd—YøeT(bøEmbedded Speech Command Set b°dONLNdÌYUeW)ñ ‚°dONLNdÓYWeY) b°dONLNdÔYZed)42°dONLNdÚførS(oøEmbedded Speech Command Erri†°dONLNdfSrç)îor Reporting >‡°dONLNdférê); 懰dONLNdfêrí) >‡°dONLNdfìrù)45°dONLNds´1(|´Summary of Phonemes and Pr;‡°dONLNd9s2j)á osodic ContrΩÄ°dONLNdEsjy)8ols ÿ`°dONLNdIsy{) X`°dONLNdJs|~) ÿ`°dONLNdKs~à)45°dONLNdNÄ´å@(â´Summary of the Speech Manager ¿ °dONLNdlÄ@åB)ï @ °dONLNdmÄCåE) ¿ °dONLNdnÄEåO)49
  15. =ˇˇa94?\4ˇˇˇˇˇˇ    (E
  16. Figure 1-0*     Listing 1-0*    T)able 1-0ˇr◊#ˇ ˇˇˇˇ#◊
  17. ˇ·ˇ‚ˆA
  18. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  19. (ø2    )BSpeech Manager Overview*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  20. °dONLNd;]G›(D]This document describes the Ã`°dONLNd;›G¯)ÄAppleI‡°dONLNd!9˘B˛(@˘®
  21. C‡°dONLNd";ˇGJ+ Speech Manager/@°dONLNd1;JGv)K
  22. , which pr»¿°dONLNd;;vGæ),ovides a standar ¿°dONLNdK;øG⁄)Idized °dONLNdQH]Tø(Q]method for Macintosh‰ °dONLNdeFøOƒ(Mø®
  23. fi °dONLNdfH≈Tã+- applications to generate synthesized speech.°dONLNdîZ]f©(c]The document prº‡°dONLNd£Z©fƒ)L=ovides an overview of the Speech Manager followed by general °dONLNd‡g]s    (p]&information about generating speech fr Ä°dONLNdg
  24. s—)≠-om text. The necessary information and calls °dONLNd3t]Ä(}],needed by all text-to-speech applications ar¿°dONLNd_tÄ›)ø+e given next, followed by a simple example °dONLNdäÅ]ç–(ä]of speech generation. More °dONLNd£Å–çz)s&e advanced calls and special-purpose rfl†°dONLNd…Åzç•)™
  25. outines ar§°dONLNd”Ŷç⁄), e described °dONLNdflé]ön(ó]last.
  26. °ºÈ4¢ºÈ
  27. ÑÈ4Õ‘È ŒŒÔ
  28. ˇ·ˇ‚ˆAˇˇ©ˇÆ°dONLNdÊπÃfi(«Speech Manager OverviewˇˇˇˇˇˇV˛(«·1
  29. °dONLNdˇ›]Èd(Ê]A∫†°dONLNd›dȧ)H complete system for speech synthesis consists of the elements shown in ⁄Ä°dONLNdH›§Èº(ʧFigur≠@°dONLNdM›ºÈ–)e 1-1J¿°dONLNdR›—È”).
  30.  È4 È" ]
  31. ˇ·ˇ‚ˆA    °dONLNdT] á(    ]
  32. Figure 1-1°dONLNd_ü )BSpeech synthesis components
  33. °dONLNd|r]~ª({]An application calls ríÄ°dONLNdírª~”)^@outines in the Speech Manager to convert character strings into °dONLNd“]ã-(à]/speech and to adjust various parameters that af7@°dONLNd.ãÁ)—,fect the quality or character of the spoken °dONLNd-å]òÏ(ï]output. The Speech Manager is rŸÄ°dONLNdLåÏòÄ)è"esponsible for dispatching these r˝@°dONLNdnåÄò÷)îequests to a speech °dONLNdÇô]•è(¢] synthesizer °dONLNdçôè•ñ)2<. The speech synthesizer converts the text into sound and crÛÄ°dONLNd…ôï•€(¢ïeates the actual °dONLNd⁄¶]≤ú(Ø]audio output. °dONLNdÈ∏]ƒp*The ]`°dONLNdÌ∏pƒ‚)Apple-supplied voices, prÔ`°dONLNd∏‚ƒ–)r5onunciation dictionaries, and speech synthesizer may °dONLNd;≈]—`(Œ]rE°dONLNd<≈a—Ø)eside in a single fi¿°dONLNdP≈∞—˛)Ole or in separate fiˇ¿°dONLNdd≈˛—1)N les. These fi=‡°dONLNdq≈2—I)4les arq‡°dONLNdw≈I—ê)e clearly identifiûÄ°dONLNdâ≈ê—“)Gable as Speech °dONLNdò“]fiç(€]    Manager–r◊°dONLNd°“çfi∞)0elated fi=Ä°dONLNd™“±fi€)$
  34. les and arfi†°dONLNd¥“€fi")*e installed and r…†°dONLNd≈“"fiÂ)G+emoved by being dragged into or out of the °dONLNdfl]Îú(Ë]System FolderÛÄ°dONLNd˝flõΆ)>. ï °dONLNdˇfl†Î)Additional voices can be pr´@°dONLNdflÎá)yovided by bundling the r¿°dONLNd2flàΆ)oesour_°dONLNd7fl†ÎÀ) ces in the °dONLNdBÏ]¯`(ı]rE°dONLNdCÏa¯y)esourç@°dONLNdHÏy¯≈)ce forks of specifi¿°dONLNd[ÏΔ¯()Mc applications. These rÚ@°dONLNdrÏ'¯?)aesour:Ä°dONLNdwÏ@¯X)ces arˆ`°dONLNd}ÏX¯Ñ)
  35. e considerΔ‡°dONLNdáÏÖ¯”)-ed private to that °dONLNdö˘]fi(]Zparticular application. It is up to the individual developers to decide whether the voice °dONLNdÙ]`*rE°dONLNdıay)esourç@°dONLNd˙y®) ces they pr7¿°dONLNd©Õ)0ovide arf@°dONLNdÕÅ)$)e usable on a systemwide basis or only fr+¿°dONLNd6Ç…)µom within their °dONLNdF]ó(]applications. °dONLNdU%]1*In the fiö°dONLNd^%1ê)"rst rQ°dONLNdc%ë1)elease of the Speech Managere`°dONLNd%1 )Å, pr,Ä°dONLNdÉ%!1ó)onunciation dictionaries ar¢¿°dONLNdû%ó1…)v
  36. e managed °dONLNd®2]>q(;]entir
  37. ¿°dONLNd≠2r>.)-ely by the application. The application is frß¿°dONLNd⁄2.>V)º
  38. ee to stor¨¿°dONLNd‰2V>À)(e dictionaries in either the °dONLNd?]K`(H]rE°dONLNd?aKy)esourç@°dONLNd?yK‰)ce or the data fork of a fi °dONLNd"?ÂKF)lle. The application is rõ°dONLNd:?FKª)aesponsible for loading the °dONLNdUL]XÂ(U]Yindividual dictionaries into RAM and then passing a handle to the dictionary data to the °dONLNdÆY]e¶*Speech ManagerÎ`°dONLNdºY•eß)H.°dONLNdæk]w<(t]0Applications that use the Speech Manager must prΔ¿°dONLNdÓk<wfi)fl$ovide their own human interface for °dONLNdx]Ñ›(Å]selecting voices and/or contrR °dONLNd/xfiÑ®)Å1olling other speech characteristics. If voices arM†°dONLNd`x®Ñπ) e pr^`°dONLNddxπÑÂ)
  39. ovided in °dONLNdnÖ]ëä(é]
  40. separate fi °dONLNdyÖãë>).*les, the speech synthesizer developer is r,‡°dONLNd£Ö>ëà)≥esponsible for pr^†°dONLNd¥ÖàëË)Joviding a method for °dONLNd…í]û¶(õ]installing these r{¿°dONLNd€í¶ûæ)Iesourƒ°dONLNd‡íæûå)/ces into the System Folder or Extensions folder∫@°dONLNd    íåû—)Œ. The computer 
  41. [ZÈòÄ8@∏HH;∑8ˇˇˇˇˇˇ@∏\X˲ԡˇ˛ı˛ˇ¿Ù˛Ô˛ˇı˛ Ù˛Ä˛ˇı˛ Ù˛@ġı˛ Ù˛  ġı˛ ˆ ˛@ġı˛ ˜Ä&˛ĸˇÄ¯Äˇı˛ ˝Äà2¸” ˚à~˛¿Ä˝˛ $˝ÄD3¸ëX3Ò˚ĸà|˛@¸
  42. Ä !ı˙`˛Ç$2˚¯T°I˚ àx@ø˘p˝
  43. @(_J‡˛ Å3ĸ"`E@÷˚ Äp‡$ÈI@˝
  44. @4J©îIJàí7@¸rpf„βÄ`‡e2J 0˛@$skÁ¿`0Ñë.  ÙÄgk‡π:s‡>˛@˝Ä|‡Ñâ*@ÙÄ`‡˘?‡H‡˛    ¿¿ÇI'Ä~Ù˛Ä`‡˘?¸T‡˚¯ÇI'ÅÙˇÄeÛ‡˘ˇ˛U‡|˚ˇ¸ ÇIÄ'ÄÇÙ‡Ä`‡˘?¿IÃoÑ˚ćÇIÄ1@`D˚ ÄÄ`‡˘8˛L‡pÑâ@* ê(˚HBĸÄgª‡ı@˛ê@˝8Ñë@,ˇ˝¥ÍΔ߂ĸÄ`‡ı@Ó˝àí +`˝úO√È@˚ᇇı@$R˝Å ,˝§ì*Ä˚ÅÁc‡ˆ    @45ï˝Ç$ ,˝$”Ö}»˚Ň@ˆ    @(⁄⁄˝ÄD ¿ÒŇıÄ ¯Äà ˛Ä?ŒÒŇı˛ ˜Ä ˛@>ÒèÄ?ı˛ ˆ  ˛ ÒÅˇˇı˛ ı ˛Åˇˇı˛ ı@˛ Åˇˇı˛ ı@˛@˛ˇı˛ ıIJÄ˛ˇı˛ ıIJԡˇ˛ı˛ˇ¿Ù……………………………Ô˛ÙÄÒ(˛ ÙÄÒ"({‹wà˚Ωú˜ fl}Ó„ #9ø‡˘û˚ÔwÙ!(%((î©B»ˆ
  45. ¡("$BîQíëêê˘    A"Ù!|%((!B®ˆ
  46. !/>¬îQRê‡˘    y>Ù"D9»(!Bò˜ »"BTy3—–†˘éA"Ù"B!    (¢!Bò˜ "$Bdâ4Pêê˘àA"Ù"ÁsüwwsΩ»˜ „ü}ŒÁ/flûÔ?ÿ˘˚ÓwÙ……………‹Ô›Ô›lˇÔ˜ø‡ˆ‹¡FUDâ)ꈋ!ED|Ù"‡ˆ›уDÉ"†ˆ›уDâ$êꈛ·ŒNÔ˛øÿˆˇ§◊#ˇ ˇˇˇˇ#◊
  47. ˇ·ˇ‚ˆA
  48. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Speech Manager Concepts, Palatino
  49. (ø3(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  50. °dONLNd;{G§(D{    must be r¿°dONLNd    ;§GC))$ebooted after speech synthesizers ar¿°dONLNd-;DGÑ)†e added to or rÂ@°dONLNd<;ÑG±)@    emoved fr‡°dONLNdE;≤Gı).om the System °dONLNdSH{Tœ(Q{Folder for the desir. °dONLNdgH–T)Ued changes to be rä`°dONLNdyHTN)O
  51. ecognized.
  52. [9v4\9v
  53. Ü9é4á9é à9à
  54. ˇ·ˇ‚ˆAˇˇ©ˇÆ°dONLNdÖs9ܘ(Å9Speech Manager ConceptsˇˇˇˇˇˇV˛(Åˇ1
  55. °dONLNdûó{£ (†{&On a simple level, speech synthesis fro °dONLNdƒó £ß)•om text input is a two-stage pr\`°dONLNd„óߣ‹)áocess. First, °dONLNdÒ§{∞C(≠{.plain-language English text is converted into À†°dONLNd§C∞p)»phonemicU¿°dONLNd'§q∞w). rö¿°dONLNd)§w∞Ö)epr+Ä°dONLNd,§Ü∞Ÿ)esentations for the °dONLNd@±{ΩΩ(∫{individual worÈ@°dONLNdN±ΩΩC)Bds. Phonemes stand for specifi¿°dONLNdl±DΩ˙)á*c sounds; for a complete explanation, see °dONLNdñæ{ («{“Summary of Phonemes and Pr;‡°dONLNd±æ ?)å osodic ContrΩÄ°dONLNdΩæ? S)8ols,”ÿ`°dONLNd¬æS “) later in this document. The rm°dONLNd‡æ” ˘)Ä    esulting °dONLNdÈÀ{◊¯(‘{Ssequence of phonemes is converted into audible sounds by mapping of the individual °dONLNd<ÿ{‰B*+phonemes to a series of waveforms, which arS`°dONLNdgÿB‰¶)«e sent to the sound harâ¿°dONLNd~ÿ¶‰Ω)ddwar¡Ä°dONLNdÇÿΩ‰˝)e to be played.°dONLNdíÍ{ˆä(Û{In rÙ‡°dONLNdñÍ䈢)ealityE°dONLNdúÍ¢ˆÚ), each stage is mor‹@°dONLNdØÍÚˆˆ)P;e complicated than this description suggests. For example, °dONLNd͘{£({Aduring the text-to-phoneme conversion stage, number strings, abbrÆÄ°dONLNd+˜£(£eviations, and special °dONLNdB{[({0symbols must be detected and converted into appra °dONLNdr[é)‡ opriate wor—@°dONLNd}é±)3ds befor↰dONLNdÖ≤)$e being converted °dONLNdó{({Vinto phonemes. When a sentence such as “He earned over $2,000,000 in 1990” is spoken, °dONLNdÌ{*‰*it would normally be pr@°dONLNdÂ*)jAeferable to say “He earned over two million dollars in nineteen- °dONLNdE+{78(4{*ninety” rather than “He earned over dollar€°dONLNdo+87ú)Ω-sign, two, comma, zer‡°dONLNdÖ+ú7¥)do, zer‰ °dONLNdã+¥7Ã)o, zerË@°dONLNdë+Ã7¸)
  56. o, comma, °dONLNdõ8{Dà(A{zer†°dONLNdû8âD°)o, zer¿°dONLNd§8°Dπ)o, zer‡°dONLNd™8πD")o, in one, nine, nine, zer¿°dONLNdƒ8"D7)io.” T∫°dONLNd…86DG)o prv†°dONLNdÕ8HDã)oduce the desirˆ°dONLNd‹8ãD€)Ced spoken output °dONLNdÌE{Q∑(N{automaticallyÚ °dONLNd˙E∂QQ);$, knowledge of these sorts of constrv°dONLNdERQÏ)ú%uctions is built into the synthesizer—`°dONLNdCEÎQÌ)ô.°dONLNdEW{cÙ(`{PThe phoneme-to-sound conversion stage is also complex. Phonemes by themselves arÁ†°dONLNdïWÙc˚(`Ùe °dONLNdód{p≤(m{often not suf`°dONLNd§d≥pπ)8fi' °dONLNd¶dπpB)cient to describe the way a wor(‡°dONLNd≈dBpÇ)âd should be prl °dONLNd”dÇpˇ)@onounced. For example, the °dONLNdÓq{}å(z{worÄ°dONLNdÒqç}œ)d “object” is pri‡°dONLNdqœ}    )B onounced dif˛¿°dONLNdq    }):fer·@°dONLNdq}ˇ) 5ently depending on whether it is used as a noun or a °dONLNdE~{ä)(á{)verb. (When it is used as a noun, the str¢ °dONLNdn~)äÜ)Æess is placed on the fi¸@°dONLNdÖ~Üä∫)]rst syllable. f`°dONLNdì~ªä˙)5As a verb, the °dONLNd¢ã{óÜ(î{strƒ`°dONLNd•ãÜós) 9ess is placed on the second syllable.) In addition to str”@°dONLNdfiãsó)Ìess information, phonemes must °dONLNd˝ò{§≠(°{Doften be augmented with pitch, duration, and other information to prZ¿°dONLNdAò≠§˛(°≠oduce intelligible, °dONLNdU•{±Î(Æ{natural-sounding speech.°dONLNdn∑{√8**The speech synthesizer has many built-in r}@°dONLNdò∑8√)Ω0ules for automatically converting text into the °dONLNd»ƒ{–’(Õ{complex phonemic rÏ °dONLNd⁄ƒ’–„)Zepr|‡°dONLNd›ƒ‰–â)#esentation described above. However¶¿°dONLNdƒâ–ü)•, therI °dONLNdƒ†–È)e will always be °dONLNd—{›å(⁄{worÄ°dONLNd—ç›Ó)ds and phrases that ar|@°dONLNd0—Ó›)ae not prñ@°dONLNd8—›Ú)".onounced the way you want. The Speech Manager °dONLNdffi{Í√(Á{allows you to pre°dONLNdvfi√Íd)H"ovide raw phonemic information dir-@°dONLNdòfieÍë)¢ ectly in or@°dONLNd£fiëÍÌ),der to enable very pr2Ä°dONLNd∏fiÌÍ)\ecise °dONLNdæÎ{˜ë(Ù{contr>Ä°dONLNd√Îí˜)ol over the spoken output.°dONLNdfi˝{    ÿ({MBy default, speech synthesizers expect input in normal language text. HoweverÄ°dONLNd    +˝ÿ    ¯(ÿ, using °dONLNd    3
  57. {ÿ({the input mode contr– °dONLNd    G
  58. ÿK)]ols of the Speech Manager˝ °dONLNd    `
  59. K‡)s$, you can tell the synthesizer to pr‡ °dONLNd    Ñ
  60. ‡˘)ïocess °dONLNd    ä{#˜( {Qinput text in raw phonemic form. By using the embedded commands described in the °dONLNd    €${0*Wnext section, you can even mix normal language text with phonemic text within a single °dONLNd
  61. 21{=ƒ*string or text bufO°dONLNd
  62. D1≈=—)Jfer°¿°dONLNd
  63. G1–=“) .°dONLNd
  64. IC{Oå(L{See ”°dONLNd
  65. MCåO)“Summary of Phonemes and Pr釰dONLNd
  66. hCOP)å osodic ContrÄ°dONLNd
  67. tCQOe)9ols,”+`°dONLNd
  68. yCeO)' later in this document, for a listing °dONLNd
  69. †P{\Q(Y{0of the phonemic character set and each character¸`°dONLNd
  70. –PR\z)◊
  71. ’s interpr °dONLNd
  72. ⁄P{\õ))etation.ˇb◊#ˇ ˇˇˇˇ#◊
  73. ˇ·ˇ‚ˆA
  74. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  75. (ø4    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  76. =WÈ4=WÈ
  77. goÈ4hoÈ iiÔ
  78. ˇ·ˇ‚ˆAˇˇ©ˇÆ°dONLNdTg‹(bUsing the Speech ManagerˇˇˇˇˇˇV˛(b·1
  79. °dONLNdx]Ñ”(Å]This section describes the r@°dONLNd6x‘Ñì)w+outines used to add speech synthesis featur”¿°dONLNdaxìÑ∑)ø    es to an °dONLNdjÖ]ëØ(é]application. It is or7†°dONLNdÖ∞ëˆ)Sganized into thr∞@°dONLNdèÖˆë*)Fee sections: È°dONLNdúÖ*ëw)4“Getting Started”=‡°dONLNd≠Öxëõ)N     (Easy), MÄ°dONLNd∂Öõë…)# “Essential °dONLNd¡í]û”(õ]Calls—Simple and Useful”S`°dONLNdŸí‘û.)w (Intermediate), and ƒÄ°dONLNdÓí.ûë)Z“Advanced Routines.”
  80. √ È4ƒ È ≈]≈È
  81. ˇ·ˇ‚ˆAˇˇ‹.ˇ◊°dONLNd¥]√π(ø]Getting Startedˇˇˇˇˇˇ€r(ø·1
  82. °dONLNd ]÷}(”]If you’rJ`°dONLNd ~÷Ÿ)!Ne just getting started with text-to-speech conversion using the Speech Manager ¿°dONLNdj ÿ÷›(”ÿ, °dONLNdl◊]„û(‡]the following r—‡°dONLNd{◊û„)Aoutines will get you up and r›@°dONLNdò◊„á)Äunning with minimal ef≈Ä°dONLNdÆ◊ᄺ)ifort. If you’ré@°dONLNdº◊Ω„ƒ)6e °dONLNdæ‰]ó(Ì]Fdeveloping an application that does not need to choose voices, use morÄ`°dONLNd‰ó«(Ìó e than one °dONLNdÒ]˝œ(˙]channel of speech, or exer\¿°dONLNd)Òœ˝Â)rcise r°dONLNd/ÒÊ˝#)eal-time contr¿°dONLNd=Ò#˝›)=*ol over the synthesized speech, these may °dONLNdg˛]
  83. î(]be the only r≤°dONLNdt˛î
  84. ‚)7outines you need.
  85. (/È4)/È *]*È
  86. ˇ·ˇ‚ˆA °dONLNdÜ])*(%]%Determining If the Speech Manager Is 7°dONLNd´*)2)ÕA@°dONLNd¨2)Z)vailableˇˇˇˇˇˇ‘@)∞1
  87. °dONLNd∂/];c(8]Y@Ä°dONLNd∑/c;à)ou can fi Ä°dONLNd¿/â;À)&Lnd out if the Speech Manager is available with a single call to the Gestalt °dONLNd <]HÑ(E]ManagerT†°dONLNd<ÑHâ)'. .°dONLNdN]ZÇ(W]Use the ,
  88. Courier°dONLNdNÇZ¨)%Gestalt°dONLNd%N¨Z’)*
  89.  toolbox rR`°dONLNd/N’Z=))outine and the selector R`°dONLNdGN=Z£)hgestaltSpeechAttrR`°dONLNdXN£Z‡)f to determine °dONLNdf[]gt(d]<whether or not the Speech Manager is available, as shown in °dONLNd¢[tg§(dt Listing 1-1°dONLNd≠[§g≥)0. If °dONLNd≤[≥g›)Gestalt°dONLNdπ[›gfl)* ˇˇ¶T°dONLNd∫h]ta(q]rR`°dONLNdªhat})eturns ˇ˛Ú¸¯¥°dONLNd¬h}tõ)noErrˇˇ¶T;T°dONLNd«hõt), then the parameter arß°dONLNdfihtË)h5gument will contain a 32-bit value indicating one or .°dONLNdu]Åo(~]moréÄ°dONLNduoÅ0),e attributes of the installed Speech Manager°dONLNdBu0Å÷)¡(. If the Speech Manager exists, the bit .°dONLNdjÇ]é{(ã]specifi°dONLNdqÇ{éï)ed by °dONLNdwÇïé)gestaltSpeechMgrPresent°dONLNdéÇé;)ä is set.
  90. ±πÈ4≤πÈ"≤_
  91. ˇ·ˇ‚ˆA    .°dONLNdóß]≤â(Ø] Listing 1-1°dONLNd£ß°≤])D.Determining if the Speech Manager is available
  92. .°dONLNd”¡]Õ( ] Boolean SpeechAvailable (void) {°dONLNdıœo€ç+OSErr°dONLNd˝œ•€Ω)6err;°dONLNd›oÈá(Êolong°dONLNd
  93. ›•Èœ)6result;°dONLNdÎo˜k(Ùo*err = Gestalt(gestaltSpeechAttr, &result);°dONLNd?˘o5*!if ((err != noErr) || !(result & °dONLNddìS+$ (1 << gestaltSpeechMgrPresent)))°dONLNdáÅ!œ(Åreturn FALSE;°dONLNdñ#o/á(,oelse°dONLNdù1Å=…+ return TRUE;°dONLNd™?]Kc(H]}ˇä◊#ˇ ˇˇˇˇ#◊
  94. ˇ·ˇ‚ˆA
  95. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  96. (ø5(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  97. I9O4I9O J{J
  98. ˇ·ˇ‚ˆA °dONLNd;{Iß(E{Which VÇÄ°dONLNd;ßIã),(ersion of the Speech Manager Is Running?ˇˇˇˇˇˇ‘@(E1
  99. °dONLNd1O{[Ì(X{QOnce you have determined that the Speech Manager is installed, you can see which .°dONLNdÇ\{h*"version of the Speech Manager is rl°dONLNd§\hd)õunning by calling ,
  100. Courierl°dONLNd∂\dh‹)NSpeechManagerVersionl°dONLNd \‹hfl)x.
  101. ò9°4ô9† ö9ö
  102. ˇ·ˇ‚ˆA .°dONLNdÃã9ôö(ï9SpeechManagerV}°dONLNd⁄ãôô∫)`ersionˇˇˇˇˇˇ(ï1
  103. °dONLNd‚™{∂†(≥{BReturns the version of the Speech Manager installed in the system..°dONLNd%√{œÁ*pascal NumVersion °dONLNd7√Áœè)lSpeechManagerVersion (void);.°dONLNdTÎ9Ùr(Ú9 DESCRIPTION
  104. .°dONLNd`¯{Û+BSpeechManagerVersion°dONLNdt¯Û˘)x rR`°dONLNdv¯˘˛):eturns the version of the Speech Manager installed in the .°dONLNd∞{¡({Jsystem. This call should be used to determine the compatibility of your pr£‡°dONLNd˙¡˜(¡ ogram with °dONLNd{ù({the curr `°dONLNdû()#ently installed Speech Managerª‡°dONLNd+'))â.°dONLNd-99BS(@9RESULëÄ°dONLNd29SBw)T CODES
  105. °dONLNd:F{Rì+(None
  106. q9x4q9w r{r
  107. ˇ·ˇ‚ˆA °dONLNd?c{qÊ*Making Some Noiseˇˇˇˇˇˇ‘@(m1
  108. °dONLNdRw{É’(Ä{LThe most basic operation of the Speech Manager is accomplished by using the .°dONLNdûÑ{êΩ* SpeakString°dONLNd©ÑΩêC)B  call. This call passes a specifPÄ°dONLNd…ÑCêı)Ü*ic text string to be spoken to the Speech .°dONLNdÛë{ù¢(ö{ManagerT†°dONLNd˙ë¢ù§)'.
  109. Œ9÷4Œ9÷ –9–
  110. ˇ·ˇ‚ˆA °dONLNd¸¿9Œ|( 9 SpeakStringˇˇˇˇˇˇ( 1
  111. .°dONLNd    ‡{Ïè(È{The °dONLNd‡èÏ—) SpeakString°dONLNd‡—Ï>)B function passes a specifi°dONLNd2‡>ÏÏ)m)c text string to be spoken to the Speech .°dONLNd[Ì{˘¢(ˆ{ManagerT†°dONLNdbÌ¢˘§)'..°dONLNdd{…({pascal OSErr °dONLNdq…è)N!SpeakString (StringPtr myString);
  112. 9.4 9.    .°dONLNdì{*«('{Field descriptions
  113. ˇ·ˇ‚ˆA
  114. .°dONLNd¶,{8´*myString.°dONLNdØ,◊8›)\Tµ¿°dONLNd∞,‹8?)ext string to be spoken°dONLNd»Q9Zr(X9 DESCRIPTION
  115. .°dONLNd‘_{kΩ+B SpeakString°dONLNdfl_Ωk»)B= attempts to speak the Pascal-style text string contained in °dONLNd_»k¯(h»myString°dONLNd$_¯k˝)0. .°dONLNd&l{x∞(u{ Speech is prÉ@°dONLNd2l∞xˆ)5oduced asynchrï`°dONLNd@lˆx)F<onously using the default system voice. When an application °dONLNd|y{Ö‹(Ç{Pcalls this function, the Speech Manager makes a copy of the passed string and cr¿°dONLNdÃy›Öı(Ç›eates °dONLNd“Ü{íô(è{any stræÄ°dONLNdŸÜôí∞)ucturD`°dONLNdfiܱí¿)es rê°dONLNd‚Ü¿í◊)equirß@°dONLNdÁÜ◊í)ed to speak it. (¿°dONLNd˜Üíº)@$As soon as speaking has begun, contrI‡°dONLNdܺí‘)•ol is rí °dONLNd"Ü‘í) eturned to °dONLNd-ì{üä(ú{=the application. The synthesized speech is generated transpar߆°dONLNdjìäü˛(úäently to the application so ˇ>◊#ˇ ˇˇˇˇ#◊
  116. ˇ·ˇ‚ˆA
  117. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  118. (ø6    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  119. °dONLNd;]Gù(D]that normal prì °dONLNd;ùGπ)@Aocessing can continue while the text is being spoken. No further °dONLNdOH]T(Q](interaction with the Speech Manager is r›‡°dONLNdwHT&)≤equirı °dONLNd|H&T÷)+ed at this point, and the application is fr    `°dONLNdßH◊T„)±ee °dONLNd™U]al(^]to r|‡°dONLNdÆUla§)elease or pur5Ä°dONLNdªU•a()9 ge or trash the original string..°dONLNd‹g]sg(p]If ,
  120. Courier°dONLNdflggs©)
  121. SpeakString°dONLNdÍg©sÃ)BE is called while a prior string is still being spoken, the audio currR`°dONLNd/gÃsÊ(pÃently .°dONLNd5t]Ä—(}]being synthesized is interr‹ °dONLNdPt—Ä%)tupted immediatelyS°dONLNdat%Ä·)T,. Conversion of the new text into speech is °dONLNdçÅ]ç„(ä] then initiated. If an empty (zer˙‡°dONLNd≠Å„ç≈)Ü7o length) string or a null string pointer is passed to .°dONLNd‰é]öü(ó] SpeakString°dONLNdÔéüöÀ)BG, it stops the synthesis of any prior string but does not generate any .°dONLNd6õ]ß≠(§]additional speech.°dONLNdI≠]πfl*As with all Speech Manager rdONLNde≠flπP)Çoutines that expect text ar°dONLNdÄ≠Qπÿ)rguments, the text may contain °dONLNdû∫]ΔΔ(√]embedded speech contr^@°dONLNd≥∫ΔΔ)iol commands. °dONLNd¡‡ÈK(Á Result Codes
  122. -4È4.4È /]/È
  123. ˇ·ˇ‚ˆA °dONLNdT ]. +BC#Determining If Speaking Is Completeˇˇˇˇˇˇ‘@(*‚1
  124. .°dONLNdy4]@    (=]&Once an application starts a speech prR`°dONLNdü4    @:)¨ ocess with R`°dONLNd™4:@|)1 SpeakStringR`°dONLNdµ4|@„)B, the next thing it will .°dONLNdŒA]Mf(J]prG °dONLNd–AgM—)
  125. Qobably need to know is whether the string has been completely spoken. It can use .°dONLNd!N]Zô(W]
  126. SpeechBusy°dONLNd+NôZö)<: to determine whether or not the system is still speaking.
  127. äìÈ4ãíÈ ååÔ
  128. ˇ·ˇ‚ˆA .°dONLNdf}ã](á
  129. SpeechBusyˇˇˇˇˇˇ(á„1
  130. .°dONLNdrú]®j(•]Th°dONLNdtúj®p)e°dONLNduúp®r) °dONLNdvúr®Æ)
  131. SpeechBusy°dONLNdÄúÆ®¥)< rR`°dONLNdÇú¥®a)'outine is useful when you want to ensur$¿°dONLNd©úa®œ)≠e that an earlier speech .°dONLNd¬©]µ`(≤]rE°dONLNd√©aµÒ)equest has been completed beforg¿°dONLNd‚©ÒµÇ)ê e having the system speak again..°dONLNd¬]Œ´(À]pascal short °dONLNd¬´Œ)NSpeechBusy (void);.°dONLNd#ÍÛT(Ò DESCRIPTION
  132. .°dONLNd/˜]ô+B
  133. SpeechBusy°dONLNd9˜ôü)< rR`°dONLNd;˜ür)/eturns the number of channels of speech that ar$¿°dONLNdj˜rä)”e curr˜ °dONLNdp˜âfl)ently synthesizing ˇˇÏN°dONLNdÉ](]+speech in the application. If you use just ˇˇƒÍ‚p°dONLNdÆT)µ SpeakStringˇˇÏN‚p°dONLNdπT™)B to initiate speech, ˇˇƒÍì®°dONLNdŒ´Á)W
  134. SpeechBusyˇˇÏNì®°dONLNdÿÁË)< °dONLNdŸ]õ(]will always rR`°dONLNdÊõ7)>%eturn 1 as long as speech is being pr$¿°dONLNd 7y)úoduced. When $¿°dONLNdyµ)B
  135. SpeechBusy$¿°dONLNd"µª)< r˜ °dONLNd$∫·)
  136. eturns 0, .°dONLNd.]*…(']all initiated speech has fitÄ°dONLNdI *Ï)mnished. °dONLNdREN5(LRESULëÄ°dONLNdWE5NY)T CODES
  137. °dONLNd_R]^u+(None
  138. }ÑÈ4}ÉÈ ~]~È
  139. ˇ·ˇ‚ˆA °dONLNddo]}e*Aÿ@°dONLNdeod}æ) Simple Exampleˇˇˇˇˇˇ‘@(y‚1
  140. °dONLNdvÉ]è√(å]The example shown in  °dONLNdãɃèÚ)g Listing 1-2º`°dONLNdñÉÚèy). demonstrates how to use the r}Ä°dONLNd¥Ézè¨)à outines intr>°dONLNd¿É≠è€)3
  141. oduced in °dONLNd ê]ú¢(ô]this section. It fiO@°dONLNd›ê£úfi)Frst makes sur4 °dONLNdÍêfiúÂ);=e the Speech Manager is available. Then it starts speaking a .°dONLNdÕÓ]˙{(˜]noErr.°dONLNd”Ó·˙Ê)Ñ0°dONLNd’Ó˙˙)No errE†°dONLNd€Ó˙ )or.°dONLNdfl˘]ô(]
  142. memFullErr.°dONLNd͢“Ê)u–108°dONLNdÔ˘˙~)(Not enough memory to speak.°dONLNd ]∑(]synthOpenFailed.°dONLNd“Ê)u–241°dONLNd ˙fi)(1Could not open another speech synthesizer channelˇ8◊#ˇ ˇˇˇˇ#◊
  143. ˇ·ˇ‚ˆA
  144. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  145. (ø7(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  146. °dONLNd;{G©(D{ string (har• °dONLNd ;©G;). d-coded in this example, but morHÄ°dONLNd+;<Gù)ìe commonly loaded frV °dONLNd?;ùGπ)aom a rd†°dONLNdE;πG—)esour¨‡°dONLNdJ;—GÛ)ce) and °dONLNdRH{T⁄(Q{loops, doing some scr/°dONLNdgH€T˚)`Aeen drawing, until the string is completely spoken. This example .°dONLNd®U{a°(^{    uses the ,
  147. Courier°dONLNd±U°a˚)&SpeechAvailable°dONLNd¿U˚a)Z rR`°dONLNd¬UaI)outine shown in R`°dONLNd“UIay)H Listing 1-1R`°dONLNd›Uya|)0.
  148. Ñ9å4Ö9å"Ö9_
  149. ˇ·ˇ‚ˆA    .°dONLNdflz{Öß(Ç{ Listing 1-2°dONLNdÎzøÖH)DElementary Speech Manager calls
  150. .°dONLNd î{†∑(ù{
  151. OSErr err;°dONLNd¢{Æ *if (SpeechAvailable()) {°dONLNd1∞çºß+/err = SpeakString("\pThe cat sat on the mat.");°dONLNdbæç Û*if (err == noErr)°dONLNdvÃüÿ/+while (SpeechBusy() > 0)°dONLNdí⁄±Ê;+CoolAnimationRoutine();°dONLNd´ËçÙ•(Òçelse°dONLNd≤ˆüA+NotSoCoolAlertRoutine(err);°dONLNdŒ{Å({}
  152. 69=479= 8{8
  153. ˇ·ˇ‚ˆAˇˇ‹..ˇ◊°dONLNd–'{6Q*%!Essential Calls—Simple and Usefulˇˇˇˇˇˇ€r(2ˇ1
  154. °dONLNdÛ={I¨(F{ While the ré °dONLNd˛=¨Iÿ)1
  155. outines prT†°dONLNd=ŸIU)-esented in the last section arJ`°dONLNd&=UIˆ)|(e simple to use, their applicability is °dONLNdNJ{V¿(S{Llimited to a few basic speech scenarios. This section describes additional r£°dONLNdöJ¿V(S¿outines that let °dONLNd´W{cÀ(`{you work with dif◊Ä°dONLNdºWÀc◊)Pfer∫°dONLNdøW◊c¸) Dent voices and adjust some basic characteristics of the synthesized °dONLNdd{põ(m{speech.
  156. é9ï4è9ï ê{ê
  157. ˇ·ˇ‚ˆA °dONLNd Å{èÜ*Wú¿°dONLNd ÅÜèµ) orking WÒ°dONLNdŵèÕ)/ith VI¿°dONLNdÅÕèÈ)oicesˇˇˇˇˇˇ‘@(ã1
  158. °dONLNd ï{°(û{[When describing a person’s voice, we talk about the particular set of characteristics that °dONLNd{¢{Æ9*-help us to distinguish that person’s voice fr?@°dONLNd®¢:Æl)ø
  159. om anotherb@°dONLNd≤¢lÆ˘)2!. For example, the rate at which °dONLNd”Ø{ªı(∏{Xone speaks (slow or fast) and the average pitch (high or low) characterize a particular °dONLNd+º{»Ω*speaker on a crȇ°dONLNd:ºΩ»é)B/ude level. In the context of the Speech Manager. °dONLNdiºé»Ë)—, a voice is the set of °dONLNdÅ…{’ˆ(“{Xparameters that specify a particular quality of synthesized speech. This portion of the °dONLNdŸ÷{‚g*3Speech Manager is used to determine which voices ar˝@°dONLNd ÷g‚ˇ)Ï%e available and to select particular °dONLNd1„{Ôò(Ï{voices.°dONLNd9ı{≥* Every specifi{Ä°dONLNdFı¥)9Hc voice has a unique ID associated with it, which is the primary way an °dONLNdé{≥( {application r{‡°dONLNdõ≥Í)8efers to it. Wˆ°dONLNd©Í€)77ithin the Speech Manager a unique voice ID is called a .°dONLNd‡{±({    VoiceSpec°dONLNdȱø)6 strl°dONLNdÌø’)uctur>`°dONLNdÚ’›)e..°dONLNdı!{-„(*{The Speech Manager pr+†°dONLNd
  160. !‰-)i ovides two r&°dONLNd!-ô)7outines to count and step thrÓ‡°dONLNd3!ô-›)~ough the list of .°dONLNdD.{:å(7{currR`°dONLNdH.å:˜)ently available voices. R`°dONLNd`.˜:9)k CountVoicesR`°dONLNdk.9:Ê)B& is used to compute how many voices ar$¿°dONLNdë.Ê:Ì)≠e °dONLNdì;{GÁ(D{available with the currR`°dONLNd™;ÁG)l ent system. R`°dONLNd∂;G])4 GetIndVoiceR`°dONLNd¡;]GÈ)B# uses an index, starting at 1, to r$¿°dONLNd‰;ÈG)åeturn .°dONLNdÍH{TÌ(Q{information about all curr¿°dONLNdHÓTM)sently installed voices..°dONLNdZ{f†(c{Use the °dONLNd$Z†f‚)% GetIndVoice°dONLNd/Z‚fË)B rR`°dONLNd1ZËf5)outine to step thr$¿°dONLNdCZ5fÙ)M,ough the list of available voices. It will fi$¿°dONLNdpZÙf)øll a °dONLNdug{s±(p{    VoiceSpec°dONLNd~g±s∑)6 rR`°dONLNdÄg∑s…)ecor$¿°dONLNdÑg…s)Hd that can be used to obtain descriptive information about the voice or .°dONLNdÃt{ÄÍ(}{to speak using that voice.°dONLNdÁÜ{íy*:Any application that wishes to use multiple voices will prC`°dONLNd!Üzí‚)ˇobably need additional .°dONLNd8ì{üb(ú{2information about the available voices beyond the °dONLNdjìbüò)Á    VoiceSpec°dONLNdsìòü¶)6 strl°dONLNdwì¶üº)uctur>`°dONLNd|ìºü˙)e, such as the ˇî◊#ˇ ˇˇˇˇ#◊
  161. ˇ·ˇ‚ˆA
  162. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  163. (ø8    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  164. °dONLNd;]Gœ(D]name of the voice and per—†°dONLNd;œGÀ)r8haps what script and language each voice supports. This °dONLNdQH]T«(Q]information might be pr3°dONLNdhH»TÁ)kBesented to the user in a “voice picker” dialog box or voice menu, °dONLNd™U]a^(^]<or it might be used internally by an application trying to fi« °dONLNdÁU^afi(^^nd a voice that meets certain .°dONLNdb]nÖ(k]
  165. criteria. !†°dONLNdbÖnˆ)(Applications can use the ,
  166. Courier!†°dONLNd(bˆnh)qGetVoiceDescription!†°dONLNd;bhnn)r rÙ°dONLNd=bmnfl)outine for these purposes.
  167. ûßÈ4ü¶È ††Ô
  168. ˇ·ˇ‚ˆA .°dONLNdXëüC(õMakeV’Ä°dONLNd]ëBüq)'oiceSpecˇˇˇˇˇˇ(õ„1
  169. °dONLNdg∞]ºc(π]Tµ¿°dONLNdh∞bº)#o maximize compatibility with futurK¿°dONLNdã∞ºñ)° e versions of the Speech Manager3@°dONLNd´∞ñºœ)ì, you should .°dONLNd∏Ω]…ë(Δ] always use °dONLNd√Ωë…fl)4MakeVoiceSpec°dONLNd–Ωfl…J)N instead of setting the fi°dONLNdÍΩJ…|)k elds of the °dONLNdˆΩ|…≤)2    VoiceSpec°dONLNdˇΩ≤…¿)6 strl°dONLNdΩ¿…÷)uctur>`°dONLNdΩ÷…›)e .°dONLNd
  170.  ]÷i(”]dirI °dONLNd j÷~)ectly! °dONLNd ~÷Ä)..°dONLNd„]Ô´(Ï]pascal OSErr °dONLNd!„´Ô„)N4MakeVoiceSpec (OSType creator, OSType id, VoiceSpec °dONLNdUÒ]˝ç(˙]*voice);°dONLNd^    ]˘*typedef struct VoiceSpec {°dONLNdzo#ì+OSType°dONLNdÉ•#’)6creator;°dONLNdå’#€)0 °dONLNdé€#„),// determines which synthesizer is required °dONLNdº%o1ì(.oOSType°dONLNd≈%•1∑)6id;°dONLNd %…1œ)$ °dONLNdÃ%€1≠)#// voice ID on the specified synth °dONLNd3]?•(<] } VoiceSpec;
  171. M\È4M[È    .°dONLNd˝L]W©*Field descriptions
  172. ˇ·ˇ‚ˆA
  173. .°dONLNdY]eá*creator.°dONLNdYπe)\The synthesizer r]@°dONLNd)Ye)LequirtÄ°dONLNd.YeÄ)ed by your application.°dONLNdEh]ti(q]id.°dONLNdHhπtŸ)\Identifiÿ°dONLNdPhŸtU) cation number for this voice.°dONLNdmw]ÉÅ(Ä]*voice°dONLNdtwπɢ)\Pointer to the °dONLNdÉw˘É/)@    VoiceSpec°dONLNdåw/É=)6 strl°dONLNdêw=ÉS)uctur>`°dONLNdïwSÉX)e.°dONLNdóù¶T(§ DESCRIPTION
  174. .°dONLNd£™]∂Œ+BMost voice management rR`°dONLNd∫™Œ∂Ö)q+outines expect to be passed a pointer to a R`°dONLNd™Ö∂¡)∑
  175. VoiceSpec °dONLNdÔ∑]√i(¿]strl°dONLNdÚ∑i√) uctur>`°dONLNd˜∑√â)e. >`°dONLNd˙∑â√◊)
  176. MakeVoiceSpec>`°dONLNd∑◊√)N is a utility r¿°dONLNd∑√8)9    outine pr„ °dONLNd∑7√≠)'ovided to facilitate the crµÄ°dONLNd:∑≠√◊)v
  177. eation of °dONLNdDƒ]–ì(Õ]    VoiceSpec°dONLNdMƒì–ô)6 rR`°dONLNdOƒô–´)ecor$¿°dONLNdSƒ´–Õ)ds. On r˜ °dONLNd[ƒÃ–)!eturn, the passed ˜ °dONLNdmƒ–Q)O    VoiceSpec˜ °dONLNdvƒQ–_)6 str„ °dONLNdzƒ_–u)ucturµÄ°dONLNdƒu–µ)e contains the .°dONLNdé—]›q(⁄]apprI@°dONLNdí—r›≤)opriate values..°dONLNd¢„]Ôe(Ï]Vd@°dONLNd£„dÔÜ)oices ar6†°dONLNd´„ÜÔû)"e stor    °dONLNd±„ûÔ∫)ed in r€`°dONLNd∏„πÔ–)esour≠¿°dONLNdΩ„–Ô) ces of type ≠¿°dONLNd…„Ô%)1'ttsv'≠¿°dONLNdœ„%ÔH)$     in the rÄ °dONLNdÿ„HÔ_)#esourRÄ°dONLNd›„_Ô√)ce fork of Macintosh fiRÄ°dONLNdÙ„√ÔÈ)d    les. The .°dONLNd˝]¸˙(˘]!Speech Manager uses the same searw °dONLNd˙¸f)ùch method as the Resour °dONLNd5g¸ö)m
  178. ce ManageröÄ°dONLNd?ô¸—)2, looking for .°dONLNdM˝]    {(]voice rR`°dONLNdT˝{    í)esour$¿°dONLNdY˝í    ª)
  179. ces in thr˜ °dONLNdc˝∫    ‘)(ee dif…Ä°dONLNdi˝‘    ·)ferõ‡°dONLNdl˝·    {)"ent locations when attempting to rn@°dONLNdé˝{    ö)öesolve n@°dONLNdï˝ö    –)    VoiceSpecn@°dONLNdû˝–    “)6 .°dONLNdü
  180. ]`(]rE°dONLNd†
  181. aq)eferÒ °dONLNd§
  182. qù) ences. It fi0†°dONLNd∞
  183. û )- rst looks in the application’s rŸ`°dONLNd–
  184.  8)Çesour!†°dONLNd’
  185. 9J)ce fiË@°dONLNd⁄
  186. Jß)le chain. If the specifiÄ°dONLNdÚ
  187. ®ÿ)^ ed voice is °dONLNd˛]#¬( ]not found in an open fiÒ`°dONLNd¬#Á)eEle, it then looks in the System Folder and the Extensions folder (or .°dONLNdZ$]0-(-]/in just the System Folder under System 6) for fi°dONLNdä$-0^)– les of type °dONLNdñ$^0Ç)1'ttsv'°dONLNdú$Ç0»)$ (single-voice fi°dONLNd≠$»0Ê)Fles) or °dONLNdµ1]=Å(:]'ttsb'°dONLNdª1Å=æ)$ (multivoice fPÄ°dONLNd…1æ=£)=3iles) and in text-to-speech synthesizer component f!°dONLNd¸1£=æ)Âiles (fÒÄ°dONLNd1Ω=„)    ile type °dONLNd >]JÅ(G]'INIT'°dONLNd>ÅJé)$ or °dONLNd>éJ≤)'thng'°dONLNd>≤J√)$). Vd@°dONLNd >¬JÎ)
  188. oices stor6†°dONLNd*>ÎJº))/ed in the System Folder or Extensions folder ar    °dONLNdY>ºJ√)—e .°dONLNd[K]W (T])normally available to all applications. V6‡°dONLNdÑK W5)Ø
  189. oices storEÄ°dONLNdéK5Wa)) ed in the r°dONLNdôKbWz)-esourO@°dONLNdûKzWÁ)ce fork of an application °dONLNd∏X]dc(a]fiå¿°dONLNd∫Xcdz)les ar¿¿°dONLNd¿XzdÛ)e private to the application.ˇfi◊#ˇ ˇˇˇˇ#◊
  190. ˇ·ˇ‚ˆA
  191. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  192. (ø9(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü°dONLNd;9DS(B9RESULëÄ°dONLNd;SDr)T CODE
  193. °dONLNdZ{f+(!!While the determination of specifi‰°dONLNd@ZfŸ)ñ0c voice ID values is mostly left to synthesizer .°dONLNdpg{sfi(p{developers, the voice ,
  194. Courier°dONLNdÜgfis)ccreator°dONLNdçgs4)*
  195.  values arR`°dONLNdóg4sY),e specifiR`°dONLNd†gYss)%ed by Ù°dONLNd¶grs‘)Apple (they would orΔ`°dONLNd∫g‘s˝)b    dinarily °dONLNd√t{Äå(}{corrR`°dONLNd«tåÄÓ)espond to a developer¿°dONLNd‹tÔÄ    )c’s curr‚ °dONLNd„tÄS)ently assigned cr¥Ä°dONLNdÙtSĺ)Keator ID). For both the ¥Ä°dONLNd tºÄÊ)icreator¥Ä°dONLNdtÊÄ˚)* and °dONLNdÅ{çá(ä{id°dONLNdÅáçç)  fPÄ°dONLNdÅçç¶)ields Ú °dONLNd"Å•çÎ)Apple further rƒÄ°dONLNd1ÅÎç:)Feserves the set of ƒÄ°dONLNdDÅ:ç^)OOSTypeƒÄ°dONLNdJÅ^çõ)$ values specifï°dONLNdXÅõç¬)=    ied entirg`°dONLNdaŬç˚)'ely by space .°dONLNdné{ö◊(ó{characters and lowerê¿°dONLNdÇé◊ö )\case letters. Y@°dONLNdêé öì)5Apple is establishing a standar&@°dONLNdØéîö)àd suite of voice ID values °dONLNd õ{ßÃ(§{Lthat developers can count upon being available with all speech synthesizers.
  196. ◊9‡4ÿ9fl Ÿ9Ÿ
  197. ˇ·ˇ‚ˆA °dONLNd 9ÿd(‘9CountV}¿°dONLNd cÿ~)*oicesˇˇˇˇˇˇ(‘1
  198. .°dONLNd$È{ıè(Ú{The °dONLNd(Èèı—) CountVoices°dONLNd3È—ı◊)B rR`°dONLNd5È◊ı˘)outine r$¿°dONLNd=È˘ı§)"&eturns the number of voices available.°dONLNdd{…( {pascal OSErr °dONLNdq…â)N CountVoices (short *voiceCount);
  199. 9+49*    .°dONLNdí{&«(#{Field descriptions
  200. ˇ·ˇ‚ˆA
  201. .°dONLNd•({4∑*
  202. voiceCount.°dONLNd∞(◊4ü)\-Number of voices available to the application°dONLNdfiN9Wr(U9 DESCRIPTION
  203. .°dONLNdÍ[{g´+B
  204. Each time °dONLNdÙ[´gÌ)0 CountVoices°dONLNdˇ[Ìgç)B# is called, the Speech Manager searR`°dONLNd"[çg˛)†ches for new voices. This .°dONLNd<h{t€(q{Palgorithm supports dynamic installation of voices by applications or users. On rÍ¿°dONLNdåh€t˜(q€eturn, .°dONLNdìu{Åç(~{the °dONLNdóuçÅ…)
  205. voiceCount°dONLNd°u…Å≤)<3 parameter contains the number of voices available..°dONLNd’ú9•S(£9RESULëÄ°dONLNd⁄úS•w)T CODES
  206. Â9Ì4Â9Ì Á9Á
  207. ˇ·ˇ‚ˆA °dONLNdÙ◊9Âi(·9GetIndV—@°dONLNd˚◊hÂ})/oiceˇˇˇˇˇˇ(·1
  208. .°dONLNd˜{è({The °dONLNd˜è—) GetIndVoice°dONLNd˜—◊)B rR`°dONLNd˜◊˘)outine r$¿°dONLNd˜˘è)"!eturns information about a specifi$¿°dONLNd<˜è∞)ñc voice.°dONLNdE{…({pascal OSErr °dONLNdR…—)N,GetIndVoice (short index, VoiceSpec *voice);
  209. )984*98    .°dONLNd){4«(1{Field descriptions
  210. ˇ·ˇ‚ˆA
  211. .°dONLNdí6{Bô*index.°dONLNdò6◊B@)\Index value for a specifiG`°dONLNd±6AB_)jc voice.°dONLNdπE{Qü(N{*voice°dONLNd¿E◊Q)\Pointer to the °dONLNdœEQM)@    VoiceSpec°dONLNdÿEMQ[)6 strl°dONLNd‹E[Qq)uctur>`°dONLNd·EqQv)e.°dONLNd„j9sr(q9 DESCRIPTION
  212. °dONLNdÔx{Ñ+BAs with all other index-based r¯@°dONLNdxÑx)àoutines in the Macintosh T™°dONLNd(xxÑÒ)uoolbox, an index value of 1 .°dONLNdDÖ{ëô(é{causes °dONLNdKÖôë€) GetIndVoice°dONLNdVÖ€ëÏ)B to rR`°dONLNd[ÖÏëe)eturn information for the fiR`°dONLNdwÖeë≠)yrst voice. The or$¿°dONLNdàÖ≠ë˝)Hder that voices ar˜ °dONLNdöÖ¸ë)Oe .°dONLNdúí{û~(õ{rE°dONLNdùíû»)eturned is not pr˜@°dONLNdÆí»û˙)I esently defiƒ‡°dONLNd∫í˚û)37ned and should not be assumed. Speech Manager behavior .°dONLNd I{Uô(R{noErr.°dONLNdIÚU˜)w0°dONLNdI U')No errE†°dONLNdI(U1)or.°dONLNd·©{µô(≤{noErr.Ì™°dONLNdÁ©¡µΔ)F0Ì™°dONLNdÈ©⁄µˆ)No err≥J°dONLNdÔ©˜µ)orˇ◊#ˇ ˇˇˇˇ#◊
  213. ˇ·ˇ‚ˆA
  214. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  215. (ø10    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  216. °dONLNd;]Gò(D] when voice fié °dONLNd;òG∂);les or r™@°dONLNd;∂GŒ)esourÚÄ°dONLNd;ŒGÊ)ces arÆ`°dONLNd ;ÁG)
  217. e added, rŸ‡°dONLNd*;Gd),emoved, or modifiª °dONLNd;;eGö)Red is also pr߇°dONLNdH;öGª)5esently .°dONLNdPH]Ty(Q]undefi°dONLNdVHyT∏) ned. However¬†°dONLNdbH∑Tfi)>
  218. , calling ,
  219. Courier¬†°dONLNdlHfiT )' CountVoices¬†°dONLNdwH T-)B or ¬†°dONLNd{H-To) GetIndVoice¬†°dONLNdÜHoT⁄)B with an index of 1 will ˇˇ=`°dONLNdüU]aj(^]forR`°dONLNd¢Ujat)>ce the Speech Manager to update its list of available voices. ˇ˝∏ ıÄ°dONLNd‡Uta∂(^t GetIndVoiceˇˇ=`ıÄ°dONLNdÎU∂a–)B will rB†°dONLNdÚU—aÈ)eturn °dONLNd¯b]ne(k]a °dONLNd˙ben≥)voiceNotFound°dONLNdb≥n¬)N errR`°dONLNd b¬n‘)=or if the passed index value exceeds the number of available .°dONLNdHo]{z(x]voices.°dONLNdPïû5(úRESULëÄ°dONLNdUï5ûY)T CODES
  220. ÈÚÈ4ÍÒÈ ÎÎÔ
  221. ˇ·ˇ‚ˆA °dONLNdú‹Í8(ÊGetV}Ä°dONLNd†‹7Íç)oiceDescriptionˇˇˇˇˇˇ(Ê„1
  222. .°dONLNd±˚]q(]The °dONLNdµ˚q„)GetVoiceDescription°dONLNd»˚„È)r rR`°dONLNd ˚È )outine r$¿°dONLNd“˚ ÷)"-eturns information about a voice beyond that °dONLNdˇ]g(]prR`°dONLNdgñ)
  223.  
  224. ovided by R`°dONLNd ñÿ)/ GetIndVoiceR`°dONLNdÿ€)B.°dONLNd!]-´(*]pascal OSErr °dONLNd%!´-è)N&GetVoiceDescription (VoiceSpec *voice,°dONLNdO/ì;â(8ì)VoiceDescription *info, long infoLength);°dONLNdyGSÌ(P#enum {kNeuter = 0, kMale, kFemale};°dONLNdùGÌSπ)“"// returned in gender field below °dONLNd¡co·(l!typedef struct VoiceDescription {°dONLNd‰q-}E+long°dONLNdÏqu}ü)Hlength;°dONLNd¯qœ}M)Z// size of structure °dONLNd-ãc(à-    VoiceSpec°dONLNduãô)Hvoice;°dONLNd'œãâ)Z// synth and ID info for voice °dONLNdHç-ôE(ñ-long°dONLNdPçuô•)Hversion;°dONLNd]çœôk)Z// version code for voice °dONLNdyõ-ßK(§-Str63°dONLNdÇõußì)Hname;°dONLNdåõœß5)Z// name of voice °dONLNdü©-µQ(≤-Str255°dONLNd©©uµ•)Hcomment;°dONLNd∂©œµß)Z$// additional text info about voice °dONLNd‹∑-√K(¿-short°dONLNdÂ∑u√ü)Hgender;°dONLNdÒ∑œ√q)Z// neuter, male, or female °dONLNd≈-—K(Œ-short°dONLNd≈u—ç)Hage;°dONLNd ≈œ—w)Z// approximate age in years °dONLNd>”-flK(‹-short°dONLNdG”uflü)Hscript;°dONLNdS”œfl≈)Z)// script code of text voice can process °dONLNd~·-ÌK(Í-short°dONLNdá·uÌ´)H    language;°dONLNdï·œÌø)Z(// language code of voice output speech °dONLNdøÔ-˚K(¯-short°dONLNd»Ôu˚ü)Hregion;°dONLNd‘Ôœ˚≥)Z&// region code of voice output speech °dONLNd¸˝-    E(-long°dONLNd˝u    Ω)H reserved[4];°dONLNd˝œ    k)Z// always zero - reserved °dONLNd0 ç(} VoiceDescription;
  225. %4È4%3È    .°dONLNdD$]/©+BField descriptions
  226. ˇ·ˇ‚ˆA
  227. .°dONLNdW1]=Å**voice°dONLNd^1π=˘)\Pointer to the °dONLNdm1˘=/)@    VoiceSpec°dONLNdv1/==)6 strl°dONLNdz1==S)uctur>`°dONLNd1S=X)e°dONLNdÅ@]L{(I]*info.°dONLNdá@πLÚ)\Pointer to strÕ`°dONLNdï@ÚL    )9ucturS@°dONLNdö@
  228. L≥)&e containing parameters for the specifinÄ°dONLNd¡@≥L◊)©ed voice.°dONLNd O][ô(X]
  229. infoLength°dONLNd’Oπ[ )\Length in bytes of °dONLNdËO [#)Rinfo°dONLNdÏO#[1) strl°dONLNdO1[G)uctur>`°dONLNdıOG[L)e.°dONLNd˜u~T(| DESCRIPTION
  230. .°dONLNdÇ]é≈+BThe Speech Manager fi°dONLNdÇ≈é)hlls out the passed °dONLNd+Çév)QVoiceDescription°dONLNd;Çvé)` fi°dONLNd>Çé–)    elds with the corrR`°dONLNdPÇ–éfl)Qect °dONLNdTè]õ‘(ò]information for the specifi°dONLNdoè‘õ$)wed voice. If a null °dONLNdÉè$õZ)P    VoiceSpec°dONLNdåèZõ‚)6 pointer is passed, the Speech °dONLNd\£]Ø{(¨]noErr.°dONLNdb£‘ØŸ)w0°dONLNdd£ÌØ    )No errE†°dONLNdj£
  231. Ø)or.°dONLNdnÆ]∫´(∑]voiceNotFound.°dONLNd|Æ≈∫Ÿ)h–244°dONLNdÅÆÌ∫Ù)(Vú`°dONLNdÇÆÛ∫ )oice ry °dONLNdàÆ ∫#)esour¡`°dONLNdçÆ#∫Z) ce not foundˇÊ◊#ˇ ˇˇˇˇ#◊
  232. ˇ·ˇ‚ˆA
  233. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  234. (ø˝11(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  235. .°dONLNd;{G©(D{    Manager rR`°dONLNd    ;©Gù).8eturns information for the system default voice. If the ,
  236. CourierR`°dONLNdA;ùG˝)ÙVoiceDescriptionR`°dONLNdQ;˝Gˇ)` ˇˇçZ°dONLNdRH{TV(Q{0pointer is null, the Speech Manager simply verifi]v°dONLNdÉHWTß)‹es that the specifiÑ°dONLNdñH®T¥)Qed ˇ˛®ífi°dONLNdôH¥TÍ)     VoiceSpecˇˇçZífi°dONLNd¢HÍTÔ)6 rÚò°dONLNd§HÔT)efers °dONLNd™U{aÍ(^{to an available voice. If °dONLNdƒUÍa )o    VoiceSpec°dONLNdÕU aL)6  does not rR`°dONLNdÿULaØ),efer to a known voice, °dONLNdÔb{nÌ(k{GetVoiceDescription°dONLNdbÌnÛ)r rR`°dONLNdbÛn)    eturns a R`°dONLNdbnf)%voiceNotFoundR`°dONLNdbfnu)N err$¿°dONLNdbun~)org`°dONLNd b}n∏), as shown in g`°dONLNd.b∏nË); Listing 1-3g`°dONLNd9bËnÎ)0..°dONLNd;t{ÄÅ(}{Tµ¿°dONLNd<tÄÄ )#o maximize compatibility with futurK¿°dONLNd_t!Ä¥)° e versions of the Speech Manager3@°dONLNdt¥Ä˝)ì, the application ˇˇ…¯.°dONLNdëÅ{çÈ(ä{must pass the size of the ˇˇ]Ë;–°dONLNd´ÅÍçJ)oVoiceDescriptionˇˇ…¯;–°dONLNdªÅJçW)` strÒ»°dONLNdøÅWçm)ucturƒ(°dONLNdƒÅmç)"e. Having the application do this .°dONLNdÊé{öì(ó{ensur$ °dONLNdÎéîöj)/es that the Speech Manager will never write mora °dONLNdéjö◊)÷e data into the passed str`°dONLNd4éÿöÔ)nucturù@°dONLNd9éÔöˆ)e °dONLNd;õ{ß´(§{ than will fiÇ°dONLNdGõ´ß>)0"t even if additional information fiÕÄ°dONLNdjõ>ß[)ìelds ar@°dONLNdqõ\ßt)e defiY°dONLNdwõtßπ)ned in the futurê`°dONLNdáõπß÷)Ee. On rL@°dONLNdéõ◊ߡ)    eturning ˇˇÃ.°dONLNdó®{¥É(±{frR`°dONLNdô®É¥ë)om ˇ˝Jdk,°dONLNdú®ë¥)GetVoiceDescriptionˇˇÃk,°dONLNdØ®¥>)r, the length fiµê°dONLNdæ®>¥s);eld is set to rΠ°dONLNdÕ®s¥)5eflΠ°dONLNd–®¥)  ect the length of data actually .°dONLNdµ{¡¬(æ{written by this rf†°dONLNdµ¬¡‡)Goutine.
  237. ‰9Ï4Â9Ï"Â9_
  238. ˇ·ˇ‚ˆA    °dONLNd    ⁄{Âß(‚{ Listing 1-3°dONLNd⁄øÂC)D!Getting information about a voice
  239. .°dONLNd8Ù{›(˝{;OSErr GetVoiceGender (VoiceSpec *voicePtr, short *gender) {°dONLNduç´+OSErr°dONLNd~’Ì)Herr;°dONLNdÑçÌ(çVoiceDescription°dONLNdñÌˇ)`vd;°dONLNdõç*#('çerr = GetVoiceDescription°dONLNd∑,ü8è+((voicePtr,&vd,sizeof(VoiceDescription));°dONLNd·:çFˇ(Cçif (err == noErr) {°dONLNd˜HüTÀ+2if (vd.length > offsetof(VoiceDescription,gender))°dONLNd-V±b)+*gender = vd.gender;°dONLNdDdüp∑(müelse°dONLNdLr±~#+err = badStructLen;°dONLNdaÄçåì(âç}°dONLNddéçöœ* return err;°dONLNdpú{®Å(•{}.°dONLNdr√9ÃS( 9RESULëÄ°dONLNdw√SÃw)T CODES
  240. 9"49" {
  241. ˇ·ˇ‚ˆA °dONLNd{w+(N+Managing Connections to Speech Synthesizersˇˇˇˇˇˇ‘@(1
  242. °dONLNdF"{.¨(+{ Using the roÄ°dONLNdQ"¨.)1Poutines described earlier in this document, an application can select the voice °dONLNd°/{;÷(8{Qwith which to speak. The next step is to associate the selected voice with the pr °dONLNdÚ/◊;Ì(8◊oper °dONLNd˜<{HÕ(E{speech synthesizer≥ °dONLNd    <ÕHF)R. This is accomplished by cr,†°dONLNd%<GHÓ)z%eating a new speech channel with the .°dONLNdJI{U€(R{NewSpeechChannel°dONLNdZI€U·)` rR`°dONLNd\I·U)outine. Ù°dONLNddIU    ) Ag`°dONLNdeI    U˛)6 speech channel is a private communication connection .°dONLNdõV{bÈ(_{to the speech synthesizerH`°dONLNd¥VÈb")n, much as a fi.‡°dONLNd¬V#b1):le r%‡°dONLNdΔV1bA)efer“°dONLNd VAb)*ence number is a communication channel to °dONLNdÙc{o¶(l{    an open fip¿°dONLNd˛cßo),le in the Macintosh fi, °dONLNdco/)]
  243. le system..°dONLNdu{Åè(~{The °dONLNd#uèÅ)DisposeSpeechChannel°dONLNd7uÅ)x rR`°dONLNd9uÅ)7outine closes a speech channel when the application is .°dONLNdpÇ{éÅ(ã{fiå¿°dONLNdrÇÅéÿ)nished with it and rj@°dONLNdÜÇÿé)Weleases any rO°dONLNdìÇé()8esouró@°dONLNdòÇ(éÊ),ces that have been allocated to support the °dONLNdƒè{õÏ(ò{speech synthesizer and ar"†°dONLNd›èÌõC)re no longer needed..°dONLNd~—{›ô(⁄{noErr.°dONLNdÑ—Ú›˜)w0°dONLNdÜ— ›')No errE†°dONLNdå—(›1)or.°dONLNdê‹{Ë´(Â{paramErr.°dONLNdô‹Ë˘)m–50°dONLNdù‹ ËG)#Parameter err¿°dONLNd™‹HËQ)=or.°dONLNdÆÁ{Û∑({
  244. memFullErr.°dONLNdπÁ„Û˜)h–108°dONLNdæÁ Ûfi)(+Not enough memory to load voice into memory.°dONLNdÎÚ{˛…(˚{voiceNotFound.°dONLNd˘Ú„˛˜)h–244°dONLNd˛Ú ˛)(Vú`°dONLNdˇÚ˛))oice ry °dONLNdÚ)˛A)esour¡`°dONLNd
  245. ÚA˛x) ce not foundˇ¥◊#ˇ ˇˇˇˇ#◊
  246. ˇ·ˇ‚ˆA
  247. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  248. (ø12    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  249. IQÈ4IQÈ KKÔ
  250. ˇ·ˇ‚ˆA °dONLNd;Iä(ENewSpeechChannelˇˇˇˇˇˇ(E„1
  251. .°dONLNdZ]fq(c]The ,
  252. Courier°dONLNdZqf—)NewSpeechChannel°dONLNd&Z—f◊)` rR`°dONLNd(Z◊f˝)    outine cr$¿°dONLNd1Z˝f{)&eates a new speech channel.°dONLNdMs]´(|]pascal OSErr °dONLNdZs´É)N$NewSpeechChannel (VoiceSpec *voice, °dONLNdÄÅoçÌ(äoSpeechChannel *chan);
  253. õ™È4õ©È    .°dONLNdñö]•©(¢]Field descriptions
  254. ˇ·ˇ‚ˆA
  255. .°dONLNd©ß]≥Å**voice°dONLNd∞ßπ≥˘)\Pointer to the °dONLNdøߢ≥/)@    VoiceSpec°dONLNd»ß/≥=)6 strl°dONLNdÃß=≥S)uctur>`°dONLNd—ßS≥X)e°dONLNd”∂]¬{(ø]*chan.°dONLNdŸ∂π¬/)\Pointer to the new channel°dONLNdÙ‹ÂT(„ DESCRIPTION
  256. °dONLNdÈ]ı´+BIThe Speech Manager automatically locates and opens a connection to the pr÷†°dONLNdIÈ´ı¡(Ú´oper °dONLNdNˆ]≈(ˇ]synthesizer for a specifi܆°dONLNdgˆ≈Ã)h=ed voice and sets up a channel at the location pointed to by ˇ˛≤@.°dONLNd§]{( ]*chanˇˇê¿°dONLNd©{¥) so that it is r& °dONLNdπµe):)eady to speak with that voice. If a null ˇ˛≤@<‡°dONLNd‚eõ)∞    VoiceSpecˇˇê¿<‡°dONLNdÎõÈ)6 pointer is passed °dONLNd˛]h(]to °dONLNdh») NewSpeechChannel°dONLNd»c)`", the Speech Manager uses the currR`°dONLNd3c”)õent system default voice.ˇˇë®°dONLNdM"].s(+]TherR`°dONLNdQ"s.ò)
  257. e is no prŸ∏°dONLNd["ò.Ø)%edefiŸ∏°dONLNd`"Ø.f))ned limit to the number of speech channelˇ˛¥¯’P°dONLNdâ"g.m)∏sˇˇë®’P°dONLNdä"m.–) an application may crÓP°dONLNd†"–.Ë)ceate. .°dONLNd¶/];Ü(8]However †°dONLNd≠/Ü;>))), system constraints on available RAM, pr °dONLNd÷/>;À)∏ocessor loading, and number of °dONLNdı<]H”(E]Savailable sound channels may limit the number of speech channels actually possible.°dONLNdIcl5(jRESULëÄ°dONLNdNc5lY)T CODES
  258. Õ’È4Õ’È œœÔ
  259. ˇ·ˇ‚ˆA °dONLNdøÕù(…DisposeSpeechChannelˇˇˇˇˇˇ(…„1
  260. .°dONLNd-fl]Îq(Ë]The °dONLNd1flqÎÈ)DisposeSpeechChannel°dONLNdEflÈÎÔ)x rR`°dONLNdGflÔΪ).outine disposes of an existing speech channel.°dONLNdv¯]´(]pascal OSErr °dONLNdɯ´ß)N*DisposeSpeechChannel (SpeechChannel chan);
  261.  È4 È    .°dONLNdÆ]©(]Field descriptions
  262. ˇ·ˇ‚ˆA
  263. .°dONLNd¡]*u*chan.°dONLNdΔπ*÷)\Specifi‡°dONLNdÕ÷* )c speech channel°dONLNdfiCLT(J DESCRIPTION
  264. .°dONLNdÍQ]]x+BThis rR`°dONLNdQx]F)/outine disposes of an existing speech channel. Ù°dONLNdQE]ü)ÕAny speech channelÙ°dONLNd1Qü]•)ZsÙ°dONLNd2Q•]Ë) that have not .°dONLNdA^]j0(g]1been explicitly disposed of by the application arÿ`°dONLNdr^0j;)”e rÁ°dONLNdu^;j‹) $eleased automatically by the Speech °dONLNdôk]wˇ(t]#Manager when the application quits..°dONLNdUp]|{(y]noErr.°dONLNd[p‹|·)0°dONLNd]pı|)No errE†°dONLNdcp|)or.°dONLNdg{]áô(Ñ]
  265. memFullErr.°dONLNdr{Õá·)p–108°dONLNdw{ıáª)((Not enough memory to open speech channel.°dONLNd°Ü]í∑(è]synthOpenFailed.°dONLNd±ÜÕí·)p–241°dONLNd∂ÜıíŸ)(1Could not open another speech synthesizer channel.°dONLNdÈë]ù´(ö]voiceNotFound.°dONLNd˜ëÕù·)p–244°dONLNd¸ëıù¸)(Vú`°dONLNd˝ë˚ù)oice ry °dONLNdëù+)esour¡`°dONLNdë+ùb) ce not foundˇ◊#ˇ ˇˇˇˇ#◊
  266. ˇ·ˇ‚ˆA
  267. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  268. (ø˝13(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü°dONLNd;9DS(B9RESULëÄ°dONLNd;SDw)T CODES
  269. }9Ñ4~9Ñ {
  270. ˇ·ˇ‚ˆA °dONLNdYp{~+(8Starting and Stopping Speechˇˇˇˇˇˇ‘@(z1
  271. °dONLNdwÑ{êü(ç{    All the r∫`°dONLNdÄÑüêœ)$
  272. emaining rü†°dONLNdäÑœê5)0outines in this section rø`°dONLNd£Ñ5êL)fequir÷†°dONLNd®ÑLêfi)!e a valid speech channel to work °dONLNd…ë{ùÑ(ö{prG °dONLNdÀëÖù°)
  273. operly÷¿°dONLNd—ë†ùT)*. Once the application has successfully cr8‡°dONLNd˚ëUù˙)µ(eated a speech channel, it can start to .°dONLNd#û{™õ(ß{speak. R`°dONLNd*ûõ™¢) Yg`°dONLNd+û°™œ) ou use the ,
  274. Courierg`°dONLNd6ûœ™).    SpeakTextg`°dONLNd?û™ )6 r9¿°dONLNdAû ™’)-outine to begin speaking on a speech channel..°dONLNdo∞{º(π{"At any time during the speaking prñ °dONLNdë∞º·)ú/ocess, the application can stop the synthesizer†°dONLNd¿∞„ºÏ)Ã’s .°dONLNd√Ω{…≥(Δ{ speech. The °dONLNdœΩ≥…Ô)8
  275. StopSpeech°dONLNdŸΩÔ…ı)< rR`°dONLNd€Ωı…Ÿ)1outine will immediately abort any speech being pr$¿°dONLNd ΩŸ…)‰
  276. oduced on .°dONLNd {÷ß(”{
  277. the specifiKÄ°dONLNd! ®÷)-ed speech channel and forV¿°dONLNd: ÷æ)s'ce the channel back into an idle state.
  278. 949 9
  279. ˇ·ˇ‚ˆA °dONLNdb˘9b(9SpeakT*°dONLNdh˘bq))extˇˇˇˇˇˇ(1
  280. .°dONLNdm{$è(!{The °dONLNdqè$≈)    SpeakText°dONLNdz≈$À)6 rR`°dONLNd|À$ñ).outine converts a designated text into speech.°dONLNd´1{=…(:{pascal OSErr °dONLNd∏1…=È)N0SpeakText (SpeechChannel chan, Ptr textBuf, long°dONLNdÍ?çK’(Hç byteLength);
  281. Y9h4Y9g    .°dONLNd˜X{c«(`{Field descriptions
  282. ˇ·ˇ‚ˆA
  283. .°dONLNd
  284. e{qì*chan.°dONLNde◊qÙ)\Specifi‡°dONLNdeÙq>)c speech channel.°dONLNd't{Ä•(}{textBuf.°dONLNd/t◊ÄÊ)\Buf… °dONLNd2tÊÄ) fer of text.°dONLNd>É{è∑(å{
  285. byteLength°dONLNdIÉ◊è)\
  286. Length of °dONLNdSÉè.)-textBuf.°dONLNd[©9≤r(∞9 DESCRIPTION
  287. .°dONLNdg∂{¬)+B'In addition to a valid speech channel, °dONLNdé∂)¬_)Æ    SpeakText°dONLNdó∂_¬˜)6% expects a pointer to the text to be ˇˇÓ∞°dONLNdº√{œD(Ã{.spoken and the length in bytes of the text buf∂ê°dONLNdÍ√DœQ)…fer˘0°dONLNdÌ√PœT) . ˇˇÃÁ‡°dONLNdÔ√Uœã)    SpeakTextˇˇÓ∞Á‡°dONLNd¯√ãœ)6 will convert the given text .°dONLNd–{‹Ü(Ÿ{strƒ`°dONLNd–Ü‹?) )eam into speech using the voice and contrª†°dONLNdA–?‹Ï)π)ol settings for that speech channel. The °dONLNdj›{Ȉ(Ê{speech is generated asynchrΆ°dONLNdÖ›ˆÈ){onouslyG‡°dONLNdå›È})#. This means that contr†°dONLNd£›}Èï)dol is rË@°dONLNd™›ïÈ‹)eturned to your °dONLNd∫Í{ˆΔ(Û{application beforñÄ°dONLNdÀÍΔˆ)Ke the speech has fil†°dONLNdfi͈C)P
  288. nished (prµ °dONLNdËÍCˆí)-obably even beforõ‡°dONLNd˘ÍíˆÍ)Oe it has begun). The °dONLNd˜{ˆ({maximum length of text buf/¿°dONLNd(˜˜)|=fer that can be spoken is limited only by the available RAM. °dONLNde{§({However †°dONLNdl§I))), it’s generally not very friendly to for† °dONLNdïIÊ)•&ce the user to listen to long uninterr¿Ä°dONLNdªÊ)ùupted °dONLNd¡{÷({text unless the user rû@°dONLNd◊÷)[ equests it. .°dONLNd‰#{/Ö(,{If °dONLNdÁ#Ö/ª)
  289.     SpeakText°dONLNd#ª/))6 is called while it is currR`°dONLNd #)/¸)n1ently busy speaking the contents of a prior text .°dONLNd<0{<â(9{buf5°dONLNd?0ä<ñ)ferá¿°dONLNdB0ï<7) &, it will immediately stop speaking fr‡°dONLNdh08<Ä)£om the prior buf∂°dONLNdx0Ä<˚)Hfer and will begin speaking .°dONLNdî={IÉ(F{frR`°dONLNdñ=ÉI⁄)om the new text buf$¿°dONLNd©=⁄I@)Wfer as soon as possible. Δ`°dONLNd¬=?If)eAs with Δ`°dONLNd =fI®)' SpeakStringΔ`°dONLNd’=®IÊ)B, described on .°dONLNd‰J{Ví(S{page Z‡°dONLNdÈJìVò)5Z‡°dONLNdÍJòV„), if an empty (zer<@°dONLNd¸J„Vr)K#o length) string or a null text buf§ °dONLNdJrVÿ)èfer pointer is passed to ˇ˛Ëé.°dONLNd8W{c±(`{    SpeakTextˇˇ¢⁄°dONLNdAW±c)6, this will have the efÄ¢°dONLNdXWc)c:fect of stopping the synthesis of any prior text but will .°dONLNdíd{p(m{#not generate any additional speech..°dONLNd I{Uô(R{noErr.°dONLNdIU)ô0°dONLNdI-UI)No errE†°dONLNdIJUS)or.°dONLNdT{`Á(]{invalidComponentID.°dONLNd1T`)Ö–3000.°dONLNd7T-`R)-Invalid °dONLNd?TR`†)%SpeechChannel°dONLNdLT†`“)N
  290.  parameterˇ≤◊#ˇ ˇˇˇˇ#◊
  291. ˇ·ˇ‚ˆA
  292. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  293. (ø14    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  294. =JÈ4=JÈ,Zapf Dingbats
  295. °dONLNd<IFQ(DIs°dONLNd>]Ff)WúÄ°dONLNd>fFë)    ARNING
  296. ˇ·ˇ‚ˆA
  297. .°dONLNd    H]Th(Q]WÛ`°dONLNd
  298. HgTx)
  299. ith ,
  300. CourierÛ`°dONLNdHxTÆ)    SpeakTextÛ`°dONLNdHÆTÎ)6, unlike with Û`°dONLNd%HÎT-)= SpeakStringÛ`°dONLNd0H-Tf)B, the text buf≈¿°dONLNd>HfTò)9 fer must be .°dONLNdJT]`N(]]3locked in memory and must not move during the entir∂°dONLNd}TN`ë)Òe time that it is °dONLNdè`]l(i]%being converted into speech. This buf≠†°dONLNd¥`l)•fer is r® °dONLNdº`lS)ead at interrf‡°dONLNd…`Tlí)6upt time, and °dONLNd◊l]x≤(u]very undesirable efq°dONLNdÍl≤xV)U'fects will happen if it moves or is pur∏°dONLNdlVxp)§ged fr≈`°dONLNdlpxÄ)om °dONLNdx]ÑÇ(Å]memoryÕ °dONLNd xÅÑÉ)$.M °dONLNd"{âÉê)s°dONLNd$ù¶5(§RESULëÄ°dONLNd)ù5¶Y)T CODES
  301. Ò˙È4Ú˘È ÛÛÔ
  302. ˇ·ˇ‚ˆA °dONLNd}‰Ú[(Ó
  303. StopSpeechˇˇˇˇˇˇ(Ó„1
  304. .°dONLNdâ]q( ]The °dONLNdçq≠)
  305. StopSpeech°dONLNdó≠≥)< rR`°dONLNdô≥Å)-outine terminates speech delivery on a specifiR`°dONLNd«Åµ)Œ ed channel.°dONLNd”](´(%]pascal OSErr °dONLNd‡´(k)N StopSpeech (SpeechChannel chan);
  306. 6EÈ46DÈ    .°dONLNd5]@©(=]Field descriptions
  307. ˇ·ˇ‚ˆA
  308. .°dONLNdB]Nu*chan.°dONLNdBπN÷)\Specifi‡°dONLNd B÷N )c speech channel°dONLNd1hqT(o DESCRIPTION
  309. ˇˇI.°dONLNd=u]Å{+BAfter rõ|°dONLNdDu{Å©) eturning fr∂¯°dONLNdOu©Å∑).om ˇ˝€T°dONLNdRu∏ÅÙ)
  310. StopSpeechˇˇI°dONLNd\uÙÅs)<, the application can safely r@°dONLNdzusŃ)elease any text bufÌ¥°dONLNdçuƒÅË)Q    fer that °dONLNdñÇ]é7(ã]0that the speech synthesizer has been using. The °dONLNdΔÇ7és)⁄
  311. SpeechBusy°dONLNd–Çséy)< rR`°dONLNd“Çyé”)outine, described on .°dONLNdÁè]õt(ò]page Z‡°dONLNdÏèuõz)6Z‡°dONLNdÌèzõπ)J, can be used to determine if the text has been completely spoken. (In an °dONLNd7ú]®t(•]envirn†°dONLNd<út®§)Aonment with multiple speech channels, you may need to use the mor‰Ä°dONLNd}ú§®ÿ(•§ e advanced .°dONLNdà©]µ~(≤]status rR`°dONLNdê©~µú)!outine R`°dONLNdó©úµÍ)GetSpeechInfoR`°dONLNd§©Íµ()N, described on R`°dONLNd≥©(µ@)>page R`°dONLNd∏©@µJ)25R`°dONLNd∫©Jµ∫)
  312. , to determine if a specifiR`°dONLNd’©∫µÊ)p
  313. c channel ˇ˛“‚°dONLNdfl∂]¬´(ø]is still speaking.) ˇ¸x¶¯¶°dONLNdÛ∂´¬Á)N
  314. StopSpeechˇ˛“‚¯¶°dONLNd˝∂Á¬G)< can be called for an alrºR°dONLNd∂H¬‘)a eady idle channel without ill ef≠°dONLNd6∂‘¬Ë)åfect. .°dONLNd=›Ê5(‰RESULëÄ°dONLNdB›5ÊY)T CODES
  315. &È4%È  ] È
  316. ˇ·ˇ‚ˆA °dONLNdñ]¯+(7Using Basic Speech Controlsˇˇˇˇˇˇ‘@(‚1
  317. °dONLNd≥%]1≈(.]The Speech Manager pr+†°dONLNd»%Δ1–)i=ovides several methods of adjusting the variables that can afA¿°dONLNd%–1‚(.–fect °dONLNd
  318. 2]>Ê(;]the way speech is synthesized. § °dONLNd)2Ê>m)âAlthough most applications prHÄ°dONLNdF2n>‚)àobably do not need to use °dONLNd`?]Kæ(H]these advanced featury°dONLNdu?æKfl)aCes, two of the speech variables, speaking rate and speaking pitch, °dONLNd∏L]Xe(U]arE°dONLNd∫LfX∞)    Je useful enough that a very simple way of adjusting these parameters on a °dONLNdY]e‚(b]channel-by-channel basis is pr¡¿°dONLNd"Y‚e8)Öovided. Routines ar9`°dONLNd5Y9efi)W&e supplied that enable an application °dONLNd[f]r*(o]-to both set and get these parameters. HoweverX†°dONLNdàf*rk)Õ, the audible efj¿°dONLNdòfkr‹)Afects of changing the rate °dONLNd≥s]”(|]and pitch of speech vary fry‡°dONLNdŒs”œ)v:om synthesizer to synthesizer; you should test the actual °dONLNdÄ]å`(â]rE°dONLNd    ÄaåÅ)@esults on all synthesizers with which your application may work..°dONLNd0´]∑{(¥]noErr.°dONLNd6´ˆ∑˚)ô0°dONLNd8´∑+)No errE†°dONLNd>´,∑5)or.°dONLNdB∂]¬…(ø]invalidComponentID.°dONLNdU∂‚¬˚)Ö–3000.°dONLNd[∂¬4)-Invalid °dONLNdc∂4¬Ç)%SpeechChannel°dONLNdp∂Ǭ¥)N
  319.  parameter°dONLNdIÍ]ˆ{(Û]noErr.°dONLNdOÍ˚ˆ)û0°dONLNdQ͈0)No errE†°dONLNdWÍ1ˆ:)or.°dONLNd[ı]…(˛]invalidComponentID.°dONLNdnıÁ)ä–3000.°dONLNdtı9)-Invalid °dONLNd|ı9á)%SpeechChannel°dONLNdâıáπ)N
  320.  parameterˇ◊#ˇ ˇˇˇˇ#◊
  321. ˇ·ˇ‚ˆA
  322. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  323. (ø˝15(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  324. °dONLNd;{G«(D{Speaking rates ard °dONLNd;«GÍ)Le specifi‡°dONLNd;ÎG<)$ed in terms of wor%Ä°dONLNd,;<G)Q(ds per minute (WPM). While this unit of °dONLNdTH{Tõ(Q{measur&¿°dONLNdZHúTœ)! ement is difÒÄ°dONLNdfHœT’)3fi˛@°dONLNdhH’T) cult to defiJ`°dONLNdtHT:)0 ne in any prF¿°dONLNdÄH:Td)5    ecise way∫°dONLNdâHcT˝))%, it is generally easy to understand °dONLNdÆU{aI(^{/and use. The range of supported rates is not pr¶`°dONLNd›UIa^)Œedefib °dONLNd‚U_aŸ)ned by the Speech Manager¯`°dONLNd˚UÿaÙ)y. Each °dONLNdb{n⁄(k{speech synthesizer pr∑†°dONLNdb⁄nª)_2ovides its own range of speaking rates. FurthermorM†°dONLNdIbºnı)‚e, any specifie‡°dONLNdWbın˚)9c °dONLNdYo{{Œ(x{rate value will corr Ä°dONLNdmoœ{-)Tespond to slightly dif@°dONLNdÉo-{9)^fer„¿°dONLNdÜo8{É) ent rates with dif˙@°dONLNdòoÉ{è)Kfer‹¿°dONLNdõoè{⁄) ent synthesizers. °dONLNdÆÅ{ç—(ä{Speaking pitches arù†°dONLNd¡Å—çÈ)Ve defiŸ`°dONLNd«ÅÈçs) ned on a musical scale that corrLJ°dONLNdÁÅtç‚)ãesponds to the keys on a °dONLNdé{öú(ó{standar±Ä°dONLNdéúö‰)!d piano keyboar®†°dONLNdé‰ö^)Hd. By convention, pitches ar`°dONLNd2é_öj){e r"°dONLNd5éjöx) epr≤¿°dONLNd8éxöÆ) esented as fi≈‡°dONLNdEéÆö)6xed-point values in °dONLNdYõ{ßÆ(§{ the range frì°dONLNdeõÆ߉)3 om 0.000 thr5@°dONLNdqõÂß:)7ough 100.000, wher…`°dONLNdÉõ:ßq)Ue 60.000 corr∞`°dONLNdêõqßı)7esponds to middle C (261.625 °dONLNd≠®{¥((±{'Hz) on a conventional piano. Pitches ar±Ä°dONLNd‘®(¥3)≠e r¿ °dONLNd◊®3¥A) eprP‡°dONLNd⁄®B¥Ó)(esented on a logarithmic scale. On this °dONLNdµ{¡(æ{!scale, a change of +12 units corrÅ@°dONLNd#µ¡{)åesponds to doubling the fr)°dONLNd=µ|¡°)uequencyÄ°dONLNdDµ†¡)$, while a change of –12 °dONLNd\¬{Œ•(À{
  325. units corr›†°dONLNdf¬•Œ)*esponds to halving the fr›°dONLNd¬Œ8)nequency≈Ä°dONLNdܬ7Œ˝)$0. For a further discussion of pitch values, see °dONLNd∂œ{€€(ÿ{“Getting Information ãÄ°dONLNdÀœ€€O)`About a Speech Channel,”Ì@°dONLNd„œO€µ)t later in this document.°dONLNd¸·{ÌÅ(Í{T∫¿°dONLNd˝·ÄÌæ)ypical voice fr„‡°dONLNd ·æÌ+)>equencies might range fr\‡°dONLNd$·,ÌE)nom arÎ`°dONLNd)·EÌÌ)%ound 90 Hertz for a low-pitched male °dONLNdNÓ{˙Æ(˜{ voice to per†°dONLNdZÓØ˙•)49haps 300 Hertz for a high-pitched child’s voice. These fr0¿°dONLNdìÓ•˙“)ˆ
  326. equencies °dONLNdù˚{å({corr`°dONLNd°˚çT).espond to pitch values of 41.526 and 53.526, rG°dONLNdœ˚TÖ)« espectively°dONLNd⁄˚ÑÜ)0.°dONLNd‹{({#Changes in speech rate and pitch arºÄ°dONLNdˇ')ùe efˆ°dONLNd'¯)0fective immediately (as soon as the synthesizer °dONLNd3{&ê(#{can r†°dONLNd8ë&m)2espond), even if they occur in the middle of a wor· °dONLNdjl&t)€d.
  327. V9_4W9^ X9X
  328. ˇ·ˇ‚ˆA °dONLNdmI9Wä(S9SetSpeechRateˇˇˇˇˇˇ(S1
  329. .°dONLNd|h{tè(q{The ,
  330. Courier°dONLNdÄhèt›)SetSpeechRate°dONLNdçh›t„)N rR`°dONLNdèh„tˆ)=outine sets the speaking rate on a designated speech channel.°dONLNdÕÅ{ç…(ä{pascal OSErr °dONLNd⁄Å…ç„)N/SetSpeechRate (SpeechChannel chan, Fixed rate);
  331. õ9™4õ9©    .°dONLNd
  332. ö{•«(¢{Field descriptions
  333. ˇ·ˇ‚ˆA
  334. .°dONLNdß{≥ì*chan.°dONLNd"ß◊≥Ù)\Specifi‡°dONLNd)ßÙ≥>)c speech channel.°dONLNd:∂{¬ì(ø{rate.°dONLNd?∂◊¬·)\Wï°dONLNd@∂‡¬È)    orœÄ°dONLNdB∂ȬM)    d output speaking rate°dONLNdY‹9Âr(„9 DESCRIPTION
  335. .°dONLNdeÍ{ˆè+BThe °dONLNdiÍ舛)SetSpeechRate°dONLNdvÍ›ˆ„)N rR`°dONLNdxÍ„ˆ˘)@outine is used to adjust the speaking rate on a speech channel. °dONLNd∏˜{è({The °dONLNdº˜èß)rate°dONLNd¿˜ß) parameter is specifi°dONLNd’˜+)\    ed as a fi°dONLNdfl˜+m)(xed-point, worR`°dONLNd̘m )Bds per minute value. Ù°dONLNd˜…)\As a general .°dONLNd{~({r^†°dONLNdN).ule of thumb, “normal” speaking rates range früÄ°dONLNd>Ng)œom ar.°dONLNdCh√)ound 150 WPM to arìÄ°dONLNdU√Ó)[    ound 180 °dONLNd^{†({>WPM. It is important when working with speaking rates, howeveròÄ°dONLNdú†(†, to keep in mind that °dONLNd≥{*¥('{users will dif˜‡°dONLNd¡¥*Ã)9fer gr‹ °dONLNd«Ã*˝)Heatly in their ability to understand synthesized speech at a particular °dONLNd+{7‚(4{Vrate based upon their level of experience listening to the voice and their ability to °dONLNde8{Dd*6anticipate the types of utterances they will encounterã`°dONLNdõ8dDf)È.°dONLNdù_9hS(f9RESULëÄ°dONLNd¢_Shw)T CODES
  336. .°dONLNd©l{xô+(noErr.°dONLNdØlx)ò0°dONLNd±l,xH)No errE†°dONLNd∑lIxR)or.°dONLNdªw{ÉÁ(Ä{invalidComponentID.°dONLNdŒwˇÉ)Ñ–3000.°dONLNd‘w,ÉQ)-Invalid °dONLNd‹wQÉü)%SpeechChannel°dONLNdÈwüÉ—)N
  337.  parameterˇΔ◊#ˇ ˇˇˇˇ#◊
  338. ˇ·ˇ‚ˆA
  339. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  340. (ø16    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  341. IQÈ4IQÈ KKÔ
  342. ˇ·ˇ‚ˆA °dONLNd;In(EGetSpeechRateˇˇˇˇˇˇ(E„1
  343. .°dONLNdZ]fq(c]The ,
  344. Courier°dONLNdZqfø)GetSpeechRate°dONLNd Zøf≈)N rR`°dONLNd"Z≈fÁ)outine r$¿°dONLNd*ZÁf])"eturns the speech rate curr˜ °dONLNdEZ\f›)uently active on a designated .°dONLNdbg]s¢(p]speech channel..°dONLNdrÄ]å´*pascal OSErr °dONLNdÄ´åÀ)N0GetSpeechRate (SpeechChannel chan, Fixed *rate);
  345. ö©È4ö®È    .°dONLNd∞ô]§©(°]Field descriptions
  346. ˇ·ˇ‚ˆA
  347. .°dONLNd√¶]≤u*chan.°dONLNd»¶π≤÷)\Specifi‡°dONLNdœ¶÷≤ )c speech channel.°dONLNd‡µ]¡{(æ]*rate.°dONLNdʵπ¡    )\Pointer to the curr˚¿°dONLNd˘µ    ¡T)Pent speaking rate°dONLNd €‰T(‚ DESCRIPTION
  348. .°dONLNdË]Ùq+BThe °dONLNdËqÙø)GetSpeechRate°dONLNd(ËøÙ≈)N rR`°dONLNd*Ë≈Ù)outine is used to fiR`°dONLNd>ËÙï)Pnd out the speaking rate curr$¿°dONLNd[ËïÙ‚)Äently active on a .°dONLNdmı]¢(˛]speech channel.°dONLNd}%5(#RESULëÄ°dONLNdÇ5%Y)T CODES
  349. pxÈ4pxÈ rrÔ
  350. ˇ·ˇ‚ˆA °dONLNd÷bpo(lSetSpeechPitchˇˇˇˇˇˇ(l„1
  351. .°dONLNdÊÇ]éq(ã]The °dONLNdÍÇqé≈)SetSpeechPitch°dONLNd¯Ç≈éÀ)T rR`°dONLNd˙ÇÀé‰)>outine sets the speaking pitch on a designated speech channel.°dONLNd9õ]ß´(§]pascal OSErr °dONLNdFõ´ß—)N1SetSpeechPitch (SpeechChannel chan, Fixed pitch);
  352. ¥√È4µ√È    .°dONLNdx¥]ø©(º]Field descriptions
  353. ˇ·ˇ‚ˆA
  354. .°dONLNdã¡]Õu*chan.°dONLNdê¡πÕ÷)\Specifi‡°dONLNdó¡÷Õ )c speech channel.°dONLNd®–]‹{(Ÿ]pitch.°dONLNdÆ–π‹¬)\Fr‘ °dONLNd∞–¬‹ )    equency of voice°dONLNd¡ı˛T(¸ DESCRIPTION
  355. .°dONLNdÕ]Ç+BUse the °dONLNd’Ç÷)%SetSpeechPitch°dONLNd„÷‹)T rR`°dONLNd‹J)outine to change the curr$¿°dONLNd˛J’)nent speaking pitch on a speech .°dONLNd]Ç(]channel.°dONLNd&6?5(=RESULëÄ°dONLNd+65?Y)T CODES
  356. .°dONLNdâ)]5{(2]noErr.°dONLNdè)˜5¸)ö0°dONLNdë)5,)No errE†°dONLNdó)-56)or.°dONLNdõ4]@…(=]invalidComponentID.°dONLNdÆ4„@¸)Ü–3000.°dONLNd¥4@5)-Invalid °dONLNdº45@É)%SpeechChannel°dONLNd…4É@µ)N
  357.  parameter°dONLNd2D]P{(M]noErr.°dONLNd8D˙Pˇ)ù0°dONLNd:DP/)No errE†°dONLNd@D0P9)or.°dONLNdDO][…(X]invalidComponentID.°dONLNdWOÊ[ˇ)â–3000.°dONLNd]O[8)-Invalid °dONLNdeO8[Ü)%SpeechChannel°dONLNdrOÜ[∏)N
  358.  parameterˇx◊#ˇ ˇˇˇˇ#◊
  359. ˇ·ˇ‚ˆA
  360. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  361. (ø˝17(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  362. I9Q4I9Q K9K
  363. ˇ·ˇ‚ˆA °dONLNd;9Iê(E9GetSpeechPitchˇˇˇˇˇˇ(E1
  364. .°dONLNdZ{fè(c{The ,
  365. Courier°dONLNdZèf„)GetSpeechPitch°dONLNd"Z„fÈ)T rR`°dONLNd$ZÈf )outine r$¿°dONLNd,Z fK)"eturns the curr˜ °dONLNd;ZJfË)?#ent speaking pitch on a designated .°dONLNd^g{s¿(p{speech channel..°dONLNdnÄ{å…*pascal OSErr °dONLNd{Ä…åı)N2GetSpeechPitch (SpeechChannel chan, Fixed *pitch);
  366. ö9©4ö9®    .°dONLNdÆô{§«(°{Field descriptions
  367. ˇ·ˇ‚ˆA
  368. .°dONLNd¡¶{≤ì*chan.°dONLNdΔ¶◊≤Ù)\Specifi‡°dONLNdÕ¶Ù≤>)c speech channel.°dONLNdfiµ{¡ô(æ{pitch.°dONLNd‰µ◊¡‡)\Fr‘ °dONLNdʵ‡¡*)    equency of voice°dONLNd˜€9‰r(‚9 DESCRIPTION
  369. .°dONLNdË{Ùè+BThe °dONLNdËèÙ„)GetSpeechPitch°dONLNdË„ÙÈ)T rR`°dONLNdËÈÙ9)outine is used to fiR`°dONLNd+Ë9Ùø)Pnd out the speaking pitch curr$¿°dONLNdIËøÙ)Üently active on .°dONLNdYı{»(˛{a speech channel.°dONLNdk9%S(#9RESULëÄ°dONLNdpS%w)T CODES
  370. ^9e4^9d _{_
  371. ˇ·ˇ‚ˆA °dONLNdƒP{^≠+(7 Putting It Ü@°dONLNdœP≠^Ω)2All ˘Ä°dONLNd”PΩ^ƒ)T˘Ä°dONLNd‘P√^Î)ogetherˇˇˇˇˇˇ‘@(Z1
  372. °dONLNd›d{p€(m{The code fragment in G†°dONLNdÚd‹p
  373. )a Listing 1-4Á‡°dONLNd˝d
  374. pu). illustrates many of the rÉ`°dONLNddvp®)l outines intrC‡°dONLNd#d©pÍ)3oduced in this °dONLNd2q{}(z{section. The example steps thrÄ°dONLNdPq}û)Ö&ough the list of available voices to fi√¿°dONLNdwqû}¬)ûnd the fiõ°dONLNdÄq√}Ò)% rst female °dONLNdã~{ä¡(á{voice. Then it cr´ °dONLNdú~¡äÏ)FCeates a new speech channel and begins speaking. While the voice is °dONLNdflã{óv(î{;speaking, the pitch of the voice is continually adjusted art`°dONLNdãvó˙)˚ ound the original pitch. If the °dONLNd:ò{§Œ(°{mouse button is prû °dONLNdLòŒ§)SHessed while the voice is speaking, the code halts the speech and exits. .°dONLNdî•{±·(Æ{This example uses the °dONLNd™•·±;)fSpeechAvailable°dONLNdπ•;±P)Z and °dONLNdæ•P±§)GetVoiceGender°dONLNdÕ§±™)T rR`°dONLNdŒ•™±Î)outines shown .°dONLNd‹≤{æ•(ª{ earlier in É°dONLNdÁ≤•æ”)* Listing 1-1#@°dONLNdÚ≤‘æÈ)/ and `°dONLNd˜≤Íæ) Listing 1-3∞†°dONLNd≤æ)..
  375. ‚9Í4‚9È"„9_
  376. ˇ·ˇ‚ˆA    °dONLNd◊{‚ß(fl{ Listing 1-4°dONLNd◊ø‚)DPutting it all together
  377. .°dONLNd)Ò{˝ô(˙{OSErr°dONLNd4ÒÁ˝ˇ)lerr;°dONLNd9ˇ{ ü({Str255°dONLNdEˇÁ π)l#myStr = "\pThe bat sat on my hat.";°dONLNdi{±({    VoiceSpec°dONLNdxÁ )lvoice;°dONLNd{'€(${VoiceDescription°dONLNdí€'·)` °dONLNdñÁ'˘) vd;°dONLNdö){5•(2{Boolean°dONLNdß)Á5M)lgotVoice = FALSE;°dONLNdπ7{Cô(@{short°dONLNdƒ7ÁCk)lvoiceCount, gender, i;°dONLNd€E{Q…(N{SpeechChannel°dONLNdÓEÁQ)lchan;°dONLNdÙS{_ô(\{Fixed°dONLNdˇSÁ__)lorigPitch, newPitch;°dONLNdo{{S(x{$if (myStr[0] && SpeechAvailable()) {°dONLNd;}çâG+err = CountVoices(&voiceCount);°dONLNdd}Gâ˚)∫// count the available voices °dONLNdÑãçó±(îçi = 1;°dONLNdw){5ô(2{noErr.°dONLNd})5!)°0°dONLNd)55Q)No errE†°dONLNdÖ)R5[)or.°dONLNdâ4{@Á(={invalidComponentID.°dONLNdú4@!)ç–3000.°dONLNd¢45@Z)-Invalid °dONLNd™4Z@®)%SpeechChannel°dONLNd∑4®@⁄)N
  378.  parameterˇ
  379. <◊#ˇ ˇˇˇˇ#◊
  380. ˇ·ˇ‚ˆA
  381. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  382. (ø18    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  383. Courier
  384. .°dONLNd;oG◊(Do<while ((i <= voiceCount) && ((err=GetIndVoice(i++, &voice)) °dONLNd@IìU…+$    ==noErr))°dONLNdLWÅcá(`Å{°dONLNdPeÅqw*)err = GetIndVoice(i++, &voice)) == noErr;°dONLNd|sÅe*&err = GetVoiceGender(&voice, &gender);°dONLNd•ÅÅçâ*,if ((err == noErr) && (gender == kFemale)) {°dONLNd’èìõÛ+gotVoice = TRUE;°dONLNdÈùì©∑*break;°dONLNdÚ´Å∑á(¥Å}°dONLNdıπo≈u(¬o}°dONLNd¯«o”…*if (gotVoice) {°dONLNd
  385. ’Å·e+&err = NewSpeechChannel(&voice, &chan);°dONLNd3„ÅÔÛ*if (err == noErr) {°dONLNdJÒì˝—+5err = GetSpeechPitch(chan, &origPitch); // cur pitch °dONLNdɡì ˘*if (err == noErr)°dONLNdô•ß++err = SpeakText(chan, &myStr[1], myStr[0]);°dONLNdÃ)ì5∑(2ìi = 0;°dONLNd÷7ìC˘*if (err == noErr)°dONLNdÏE•QA+while (SpeechBusy() > 0) {°dONLNd S∑_A+CoolAnimationRoutine();°dONLNd)a∑m◊*0newPitch = (i - 4) << 16; // fixed pitch offset °dONLNd_o∑{;*newPitch += origPitch;°dONLNd{}∑â*i = (i + 1) & 7;°dONLNdå}â◊)` // steps from 0 to 7 repeatedly °dONLNd≤ã∑óï(î∑%err = SetSpeechPitch(chan, newPitch);°dONLNd›ô∑•}*!if ((err != noErr) || Button()) {°dONLNdß…≥S+err = StopSpeech(chan);°dONLNd#µ…¡Ì*break;°dONLNd/√∑œΩ(Ã∑}°dONLNd5—•›´(⁄•}°dONLNd:flìÎY(Ëì!err = DisposeSpeechChannel(chan);°dONLNd^ÌÅ˘á(ˆÅ}°dONLNda˚ou(o}°dONLNdd    o’*if (err != noErr)°dONLNdxÅ##+NotSoCoolAlertRoutine(err);
  386. IPÈ4JPÈ K]KÈ
  387. ˇ·ˇ‚ˆAˇˇ‹..ˇ◊°dONLNdî:]I”(E]Advanced Routinesˇˇˇˇˇˇ€r(E·1
  388. °dONLNdßP]\'(Y].This section describes several advanced or rar÷ °dONLNd’P'\û) ely-used Speech Manager rÇ`°dONLNdÓPü\ƒ)x    outines. ‘ °dONLNd˜Pƒ\ )%YdONLNd¯P \◊)ou °dONLNd˚]]i∫(f]can use them to imprº °dONLNd]∫i})]-ove the quality of your application’s speech.ˇ‘◊#ˇ ˇˇˇˇ#◊
  389. ˇ·ˇ‚ˆA
  390. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  391. (ø˝19(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  392. I9O4I9O J{J
  393. ˇ·ˇ‚ˆA °dONLNd;{I (E{Advanced Speech Controlsˇˇˇˇˇˇ‘@(E1
  394. .°dONLNdO{[è(X{The ,
  395. Courier°dONLNdOè[À)
  396. StopSpeech°dONLNd(OÀ[—)< rR`°dONLNd*O—[*)outine, described in R`°dONLNd?O*[æ)Y“Starting and Stopping Speech,”R`°dONLNd^Oæ[)î earlier in this .°dONLNdo\{h∂(e{ document, pr °dONLNd{\∑h7)<ovides a simple way to interrä °dONLNdò\7h√)Äupt any speech output instantly˝Ä°dONLNd∑\¬hÏ)ã
  397. . In some °dONLNd¡i{uƒ(r{situations it is pr4¿°dONLNd‘i≈ub)J%eferable to be able to stop speech prdONLNd˘ibufl)ùoduction at the next natural .°dONLNdv{Ç•({boundaryd@°dONLNdv§Ç)), such as the next wor6†°dONLNd4vÇh)_d or the end of the curr    °dONLNdLvhÇ¢)eent sentence.     °dONLNdZv¢ÇÍ): StopSpeechAt    °dONLNdfvÍÇÏ)H .°dONLNdgÉ{èÑ(å{prG °dONLNdiÉÖè‰)
  398. ovides that capability,†°dONLNdÉ„èÂ)^.ˇˇóÜ.°dONLNdÅï{°©(û{    Similarlyd@°dONLNdäï®°æ)-, the ˇ˛ΔíìL°dONLNdêïæ° )PauseSpeechAtˇˇóÜìL°dONLNdùï °)N r˝2°dONLNdüï°ƒ))outine causes speech to pause at a specifi!‹°dONLNd…ï≈°)¥ed point in the °dONLNdŸ¢{Æfl(´{text being spoken; the °dONLNd¢flÆ3)dContinueSpeech°dONLNd˛¢3Æ9)T rR`°dONLNd¢9Æ[)outine r$¿°dONLNd¢[ƈ)""esumes speech after it has paused.°dONLNd+¥{¿ª(Ω{In addition to °dONLNd:¥ª¿˝)@ SpeakString°dONLNdE¥˝¿)B and °dONLNdJ¥¿H)    SpeakText°dONLNdS¥H¿˝)6*, described earlier in this document, the ˇˇ˘‡°dONLNd}¡{Õ—( {Speech Manager prF °dONLNdé¡“Õ )Wovides a thir @°dONLNdõ¡Õ();d, morÿÄ°dONLNd°¡(ÕV) e general rû†°dONLNd¨¡WÕw)/outine. ˇˇÌ†òÄ°dONLNd¥¡xÕ∫)! SpeakBufferˇˇ˘‡òÄ°dONLNdø¡∫Õ)B is the low-level °dONLNd—Œ{⁄†(◊{speech rR`°dONLNdŸŒ†⁄?)%"outine upon which the other two ar$¿°dONLNd˚Œ?⁄a)ü    e built. $¿°dONLNdŒa⁄£)" SpeakBuffer$¿°dONLNdŒ£⁄Ø)B pr˜ °dONLNdŒÆ⁄◊)     ovides gr…Ä°dONLNdŒ◊⁄Ò))eater .°dONLNd!€{Áë(‰{contr>Ä°dONLNd&€íÁ©)ol thrı °dONLNd,€©Á2)ough the use of an additional flfi¿°dONLNdL€3Áq)äags parameter˛Ä°dONLNdY€qÁs)>..°dONLNd[Ì{˘è(ˆ{The °dONLNd_Ìè˘)SpeechBusySystemWide°dONLNdsÌ˘)x rR`°dONLNduÌ˘≠)&outine tells you if any speech is curr$¿°dONLNdõÌ≠˘·)† ently being .°dONLNdß˙{<({+synthesized in your application or elsewherÃ`°dONLNd“˙<å)¡e on the computer>Ä°dONLNd„˙åé)P.
  399. 69?479> 898
  400. ˇ·ˇ‚ˆA °dONLNdÂ)97Ü(39 StopSpeechAtˇˇˇˇˇˇ(31
  401. .°dONLNdÛH{Tè(Q{The °dONLNd˜HèT◊) StopSpeechAt°dONLNdH◊T›)H rR`°dONLNdH›Ti)outine halts speech at a specifiR`°dONLNd%HiTˆ)å!c point in the text being spoken.°dONLNdGa{m…(j{pascal OSErr °dONLNdTa…m)N4StopSpeechAt (SpeechChannel chan, long whereToStop);°dONLNdây{Öü(Ç{enum {°dONLNdëáçì…+
  402. kImmediate°dONLNd°á˘ì)l= 0,°dONLNdßïç°…(ûç
  403. kEndOfWord°dONLNd∑ï˘°)l= 1,°dONLNdΩ£çØ·(¨çkEndOfSentence°dONLNd—£˘Ø )l= 2°dONLNd’±{Ωá(∫{};
  404. À9⁄4À9Ÿ    .°dONLNdÿ {’«*Field descriptions
  405. ˇ·ˇ‚ˆA
  406. .°dONLNdÎ◊{„ì*chan.°dONLNd◊◊„Ù)\Specifi‡°dONLNd˜◊Ù„>)c speech channel.°dONLNdÊ{ÚΩ(Ô{ whereToStop.°dONLNdÊ◊Úë)\,Location in text at which speech is to stop °dONLNdA 9r(9 DESCRIPTION
  407. .°dONLNdM{%√+B StopSpeechAt°dONLNdY√%#)H is used to halt the prR`°dONLNdp#%¶)`oduction of speech at a specif"‡°dONLNdé¶%)Éied point in the text. °dONLNd•&{2è(/{The °dONLNd©&è2—) whereToStop°dONLNd¥&—2›)B arR`°dONLNd∑&›2Œ) 7gument should be set to one of the following constants:,Zapf Dingbats.°dONLNdÔ<{CÄ(B{n
  408. .°dONLNdÒ9áEõ) The °dONLNdı9õE◊)
  409. kImmediate°dONLNdˇ9◊Eï)<) constant stops speech output immediatelyd@°dONLNd(9îEô)Ω. .°dONLNd+N{UÄ(T{n
  410. .°dONLNd-KáWõ) The °dONLNd1KõW◊)
  411. kEndOfWord°dONLNd;K◊Wñ)<- constant lets speech continue until the currR`°dONLNdhKñW∑)øent wor$¿°dONLNdoK∑WË)! d has been .°dONLNdzWác´(`áspoken. °dONLNdÉl{sÄ(r{n
  412. .°dONLNdÖiáuõ) The °dONLNdâiõuÔ)kEndOfSentence°dONLNdóiÔu›)T8 constant lets speech continue until the end of the currR`°dONLNdœi›uÌ)Óent .°dONLNd”uáÅ‹(~ásentence has been rƇ°dONLNdÊu‹Åˇ)Ueached. ˇË◊#ˇ ˇˇˇˇ#◊
  413. ˇ·ˇ‚ˆA
  414. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  415. (ø20    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  416. °dONLNd;]Gv(D]This r‹Ä°dONLNd;vGò)outine rc‡°dONLNd;ôGÔ)#eturns immediatelyΩ‡°dONLNd ;ÓGœ)U3, although speech output continues until the specifi≠‡°dONLNdT;–G›)‚ed °dONLNdWH]T£(Q]point has been r3`°dONLNdgH§T≈)Geached.
  417. bpÈ4cpÈ,Zapf Dingbats°dONLNdobIlQ(jIs°dONLNdpc]kf(i]WúÄ°dONLNdqcfkë)    ARNING
  418. ˇ·ˇ‚ˆA
  419. °dONLNdxn]zc(w]Y@Ä°dONLNdynczû)ou must not r‡°dONLNdÜnûz\);*elease the memory associated with the curr}¿°dONLNd∞n]zè)ø ent text bufá °dONLNdºnèzù)2fer °dONLNd¿z]Üí(É]Huntil the channel status indicates that the speech channel output is no °dONLNdÜ]íë* longer busyπ¿°dONLNdÜêíí)3.9¿°dONLNdâòëü)s
  420. °dONLNdó]£·(†] If the end of the input text buf†°dONLNd7ó‚£˛)Öfer is r °dONLNd?ó˛£6) eached befori`°dONLNdKó6£j)8 e the specifi~Ä°dONLNdXój£Õ)4ed stopping point, the °dONLNdo§]∞Ø(≠]Nspeech synthesizer will stop at this point. Once the stopping point has been r ¿°dONLNdΩ§∞∞‰(≠∞ eached, the ˇˇE⁄.°dONLNd…±]Ω•(∫]application is frfi°dONLNd⁄±•Ωæ)Hee to r<(°dONLNd·±øΩ)elease the text buf‡°dONLNdÙ±Ω)Pfer"∂°dONLNd˜±ΩD)
  421. . Calling ,
  422. Courierˇ˝—éÆj°dONLNd±DΩå)( StopSpeechAtˇˇE⁄Æj°dONLNd±åΩ•)H with ˇ˝—é:°dONLNd±¶ΩË) whereToStopˇˇE⁄:°dONLNd±ËΩÈ)B °dONLNdæ] É(«]    equal to °dONLNd(æÉ ø)&
  423. kImmediate°dONLNd2æø +)< is equivalent to calling °dONLNdLæ+ g)l
  424. StopSpeech°dONLNdVæg •)<, described on °dONLNdeæ• Ω)>page °dONLNdjæΩ «)14°dONLNdlæ« Ã)
  425. . °dONLNdo–]‹ò(Ÿ]Contrast the °dONLNd|–ò‹‡); StopSpeechAt°dONLNdà–‡‹Ê)H rR`°dONLNdä–Ê‹) outine with R`°dONLNdñ–‹_)7 PauseSpeechR`°dONLNd°–_‹ß)B, described next..°dONLNd≥ˆˇ5(˝RESULëÄ°dONLNd∏ˆ5ˇY)T CODES
  426. JSÈ4KRÈ LLÔ
  427. ˇ·ˇ‚ˆA °dONLNd =Ko(GPauseSpeechAtˇˇˇˇˇˇ(G„1
  428. .°dONLNd\]hq(e]The °dONLNd\qhø)PauseSpeechAt°dONLNd,\øh≈)N rR`°dONLNd.\≈h{))outine causes speech to pause at a specifiR`°dONLNdX\{h”)∂ed point in the text .°dONLNdmi]uö(r]being spoken..°dONLNd{Ç]é´*pascal OSErr °dONLNdàÇ´é})N#PauseSpeechAt (SpeechChannel chan, °dONLNdÆêÅúÛ(ôÅlong whereToPause);°dONLNd¬®]¥Å(±]enum {°dONLNd ∂o¬´+
  429. kImmediate°dONLNd⁄∂€¬Û)l= 0,°dONLNd‡ƒo–´(Õo
  430. kEndOfWord°dONLNdƒ€–Û)l= 1,°dONLNdˆ“ofi√(€okEndOfSentence°dONLNd
  431. “€fiÌ)l= 2°dONLNd‡]Ïi(È]};
  432. ˙    È4˙È    .°dONLNd˘]©*Field descriptions
  433. ˇ·ˇ‚ˆA
  434. .°dONLNd$]u*chan.°dONLNd)π÷)\Specifi‡°dONLNd0÷ )c speech channel.°dONLNdA]!•(] whereToPause.°dONLNdNπ!z)\-Location in text at which speech is to pause °dONLNd|;DT(B DESCRIPTION
  435. .°dONLNdàH]Tü+B PauseSpeech°dONLNdìHüTÎ)B makes speech prR`°dONLNd£HÎT^)Loduction pause at a specif"‡°dONLNdΩH^T—)sied point in the text. The °dONLNdÿU]a•(^] whereToPause°dONLNd‰U•aÖ)H4 parameter should be set to one of these constants: .°dONLNdk]rb(q]n
  436. .°dONLNdhit}) The °dONLNdh}tπ)
  437. kImmediate°dONLNd)hπtw)<) constant stops speech output immediatelyd@°dONLNdRhvt{)Ω. .°dONLNdU}]Ñb(É]n
  438. .°dONLNdWziÜ}) The °dONLNd[z}Üπ)
  439. kEndOfWord°dONLNdezπÜx)<- constant lets speech continue until the currR`°dONLNdízxÜô)øent wor$¿°dONLNdôzôÜ )! d has been .°dONLNd§Üiíç(èispoken. .°dONLNdø]{(]noErr.°dONLNd≈˘˛)ú0°dONLNd«.)No errE†°dONLNdÕ/8)or.°dONLNd—]…(]invalidComponentID.°dONLNd‰Â˛)à–3000.°dONLNdÍ7)-Invalid °dONLNdÚ7Ö)%SpeechChannel°dONLNdˇÖ∑)N
  440.  parameterˇv◊#ˇ ˇˇˇˇ#◊
  441. ˇ·ˇ‚ˆA
  442. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  443. (ø˝21(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,Zapf Dingbats°dONLNdˇˇ(D{n
  444. .°dONLNd;áGõ) The ,
  445. Courier°dONLNd;õGÔ)kEndOfSentence°dONLNd;ÔG›)T8 constant lets speech continue until the end of the currR`°dONLNdJ;›GÌ)Óent .°dONLNdNGáS‹(Pásentence has been rƇ°dONLNdaG‹Sˇ)Ueached. °dONLNdjX{dƒ(a{When the specifi7‡°dONLNdzX≈d˘)Jed point is r˚`°dONLNdáX˘d‡)45eached, the speech channel enters the paused state, r£¿°dONLNdºX·dÎ)Ëeflz °dONLNdøXÏd) ected .°dONLNd≈e{qÂ(n{in the channel’s status. °dONLNdfieÂq3)jPauseSpeechAt°dONLNdÎe3q9)N rR`°dONLNdÌe9qí)eturns immediately6†°dONLNdˇeëq)X, although speech output .°dONLNdr{~˚({{will continue until the specifiK@°dONLNd7r¸~#)Å    ed point.°dONLNdAÑ{êˇ(ç{ If the end of the input text buf†°dONLNdaÑê)Öfer is r °dONLNdiÑêT) eached befori`°dONLNduÑTêà)8 e the specifi~Ä°dONLNdÇÑàêÓ)4ed pause point, speech °dONLNdôë{ù(ö{#output pauses at the end of the bufâ¿°dONLNdºëù!)öfer‹Ä°dONLNdøë ù") ..°dONLNd¡£{Ø…(¨{PauseSpeechAt°dONLNdŒ£…ØŸ)N difR`°dONLNd“£ŸØÙ)fers fr$¿°dONLNdŸ£ÙØ)om $¿°dONLNd‹£Ø?)
  446. StopSpeech$¿°dONLNdÊ£?ØT)< and $¿°dONLNdΣTØú) StopSpeechAt$¿°dONLNd˜£úØ˘)H in that a subsequent °dONLNd∞{ºö(π{call to °dONLNd∞öºÓ)ContinueSpeech°dONLNd#∞Óºº)T1, described next, causes the contents of the currR`°dONLNdT∞ººÓ)Œ ent text buf$¿°dONLNd`∞Óº˝)2fer .°dONLNddΩ{…Ï(Δ{to continue being spoken.
  447. ◊9Â4ÿ9°dONLNd~◊g·o(flgs°dONLNdÿ{‡Ñ(fi{WúÄ°dONLNdÄÿчØ)    ARNING
  448. ˇ·ˇ‚ˆA
  449. °dONLNdá„{Ô*(Ï{*While in a paused state, the last text bufM†°dONLNd±„+ÔV)∞
  450. fer must r}@°dONLNdª„VÔ∂)+emain available at all .°dONLNd“Ô{˚E(¯{+times and must not move. While paused, the °dONLNd˝ÔE˚ì) SpeechChannel°dONLNd
  451. Ôì˚≤)N status °dONLNd˚{ß({
  452. indicates °dONLNd˚ß„),
  453. outputBusy°dONLNd&˚„Ì)< = °dONLNd)˚Ì)
  454. true°dONLNd-˚) and °dONLNd2˚b) outputPaused°dONLNd>˚bl)H = °dONLNdA˚lÑ)
  455. true°dONLNdE˚Ñá)..°dONLNdG˛åì)s°dONLNdI 9)S('9RESULëÄ°dONLNdN S)w)T CODES
  456. t9}4u9| v9v
  457. ˇ·ˇ‚ˆA °dONLNd¢g9uì(q9ContinueSpeechˇˇˇˇˇˇ(q1
  458. .°dONLNd≤Ü{íè(è{The °dONLNd∂Üèí„)ContinueSpeech°dONLNdƒÜ„íÈ)T rR`°dONLNdΔÜÈí )outine r$¿°dONLNdŒÜ í⁄)".esumes speech after it has been halted by the °dONLNd¸ì{ü…(ú{PauseSpeechAt°dONLNd    ì…üœ)N rR`°dONLNd ìœüÓ)outine.°dONLNd¨{∏…(µ{pascal OSErr °dONLNd ¨…∏°)N$ContinueSpeech (SpeechChannel chan);
  459. Δ9’4Δ9‘    .°dONLNdE≈{–«(Õ{Field descriptions
  460. ˇ·ˇ‚ˆA
  461. .°dONLNdX“{fiì*chan.°dONLNd]“◊fiÙ)\Specifi‡°dONLNdd“Ùfi>)c speech channel°dONLNdu¯9r(ˇ9 DESCRIPTION
  462. .°dONLNdÅ{Ã+BAt any time after °dONLNdìÃ)QPauseSpeechAt°dONLNd†H)N  is called, °dONLNd¨Hú).ContinueSpeech°dONLNd∫úÍ)T may be called to ˇˇŸ"°dONLNdÃ{‘({continue speaking fr§°dONLNd‡’•)Z-om the point at which speech paused. Calling ˇˇãfÕ¥°dONLNd•˘)–ContinueSpeechˇˇŸ"Õ¥°dONLNd˘)T on .°dONLNd{+Ë(({a channel that is not curr  °dONLNd9Ë+n)m ently in a pause state has no ef9 °dONLNdYo+√)áfect; calling it beforùÄ°dONLNdo√+˜)Te a pause is °dONLNd|,{8É(5{efo‡°dONLNd~,É8Ò)fective cancels the pause.°dONLNdôS9\S(Z9RESULëÄ°dONLNdûSS\w)T CODES
  463. .°dONLNdU.{:ô(7{noErr.°dONLNd[.:)ú0°dONLNd].0:L)No errE†°dONLNdc.M:V)or.°dONLNdg9{EÁ(B{invalidComponentID.°dONLNdz9E)à–3000.°dONLNdÄ90EU)-Invalid °dONLNdà9UE£)%SpeechChannel°dONLNdï9£E’)N
  464.  parameter°dONLNd•`{lô(i{noErr.°dONLNd´`l)ö0°dONLNd≠`.lJ)No errE†°dONLNd≥`KlT)or.°dONLNd∑k{wÁ(t{invalidComponentID.°dONLNd kw)Ü–3000.°dONLNd–k.wS)-Invalid °dONLNdÿkSw°)%SpeechChannel°dONLNdÂk°w”)N
  465.  parameterˇÏ◊#ˇ ˇˇˇˇ#◊
  466. ˇ·ˇ‚ˆA
  467. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  468. (ø22    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  469. IQÈ4IQÈ KKÔ
  470. ˇ·ˇ‚ˆA °dONLNd;IP(ESpeakBufG°dONLNd;QI`)6ferˇˇˇˇˇˇ(E„1
  471. .°dONLNdZ]fq(c]The ,
  472. Courier°dONLNdZqf≥) SpeakBuffer°dONLNdZ≥fπ)B rR`°dONLNdZπfb)(outine causes the contents of a text buf$¿°dONLNdFZbf≈)©fer to be spoken, using .°dONLNd^g]sÉ(p]    certain fl5`°dONLNdhgÑs∑)' ags to contrw‡°dONLNdtg∑s    )3ol speech behaviorE¿°dONLNdÜg    s )R..°dONLNdàÄ]å´(â]pascal OSErr °dONLNdïÄ´åπ)N-SpeakBuffer (SpeechChannel chan, Ptr textBuf,°dONLNdÀéÌöÀ+B% long byteLength, long controlFlags);°dONLNdÒ¶]≤Å(Ø]enum {°dONLNd˘¥o¿œ+kNoEndingProsody°dONLNd¥Ì¿)~= 1,°dONLNd¬oŒ€(ÀokNoSpeechInterrupt°dONLNd/¬ÌŒ)~= 2,°dONLNd5–o‹·(ŸokPreflightThenPause°dONLNdO–Ì‹ˇ)~= 4°dONLNdSfi]Íi(Á]};
  473. ¯È4¯È    .°dONLNdV˜]©*Field descriptions
  474. ˇ·ˇ‚ˆA
  475. .°dONLNdi]u*chan.°dONLNdnπ÷)\Specifi‡°dONLNdu÷ )c speech channel.°dONLNdÜ]á(]textBuf.°dONLNdéπ»)\Buf… °dONLNdë»Ú) fer of text.°dONLNdù"].ô(+]
  476. byteLength°dONLNd®"π.Ê)\
  477. Length of °dONLNd≤"Ê.)-textBuf°dONLNd∫1]=•(:] controlFlags.°dONLNd«1π=“)\ContrÂ@°dONLNdÃ1“=‚)ol flœ‡°dONLNd—1„=) ags to contr`°dONLNd›1=l)4ol speech behavior °dONLNdÒW`T(^ DESCRIPTION
  478. .°dONLNd˝d]pç+B    When the °dONLNddçp’)0 controlFlags°dONLNdd’p7)H parameter is set to 0, °dONLNd*d7py)b SpeakBuffer°dONLNd5dyp‰)B behaves identically to °dONLNdMq]}ì(z]    SpeakText°dONLNdVqì}—)6, described on °dONLNdeq—}È)>page °dONLNdjqÈ}Û)13°dONLNdlqÛ}ˆ)
  479. .°dONLNdnÉ]èq(å]The °dONLNdrÉqè—)kNoEndingProsody°dONLNdÇÉ—è⁄)` fl°dONLNdÖÉ⁄è7)    ag bit is used to contrR`°dONLNdúÉ7è∫)]ol whether or not the speech .°dONLNdπê]úÛ(ô]"synthesizer automatically applies Δ°dONLNd€êÛú:)ñending prosody °dONLNdÈê:ú<)G,J°dONLNdÍê=ú”)" the speech tone and cadence that °dONLNd ù]©`(¶]:normally occur at the end of a statement. Under normal cir‡°dONLNdFùa©”(¶acumstances (for example, °dONLNd_™]∂é(≥]
  480. when the fl-Ä°dONLNdj™è∂)2ag bit is not set), ending pr@°dONLNdá™∂Ê)v3osody is applied to the speech when the end of the .°dONLNd∫∑]√á(¿]textBuf°dONLNd¡∑á√Ø)*
  481.  data is rR`°dONLNdÀ∑Ø√√)(=eached. This default behavior can be disabled by setting the °dONLNdƒ]–Ω(Õ]kNoEndingProsody°dONLNdƒΩ–√)` fPÄ°dONLNdƒ√–‰)lag bit.°dONLNd#÷]‚(fl])Some synthesizers do not speak until the °dONLNdL÷‚v)πkNoEndingProsody°dONLNd\÷v‚)` fl°dONLNd_÷‚©)     ag bit is rR`°dONLNdj÷©‚„)*eset, or they °dONLNdx„]Ô(Ï]#encounter a period in the text, or °dONLNdõ„Ô)ìtextBuf°dONLNd¢„Ô<)*
  482.  is full. °dONLNd≠ı]q(˛]The °dONLNd±ıq›)kNoSpeechInterrupt°dONLNd√ı›Ê)l fl°dONLNdΔıÊC)    ag bit is used to contrR`°dONLNd›ıCó)]ol the behavior of R`°dONLNdıóŸ)T SpeakBufferR`°dONLNd˚ıŸ€)B .°dONLNd¸]5( ]2when called on a speech channel that is still busyŒ °dONLNd.4l)◊ . When the fl$†°dONLNd;m¥)9ag bit is not set, ˇ˛Ä.°dONLNdN]ü(] SpeakBufferˇˇÄ°dONLNdYü)B behaves similarly to ˇ˛Ä°dONLNdoB)a SpeakStringˇˇÄ°dONLNdzBV)B and ˇ˛Ä°dONLNdVå)    SpeakTextˇˇÄ°dONLNdàåÈ)6, described earlier in .°dONLNdü](°(%]this document. î¿°dONLNdÆ°(È)DAny speech currˇÄ°dONLNdΩÈ(&)Hently being prµ†°dONLNdÀ'(Ö)>oduced on the specifi∂°dONLNd‡Ö(·)^ed speech channel is °dONLNdı)]5∞(2]immediately interrx†°dONLNd)∞5=)Supted and then the new text buf@‡°dONLNd&)>5®)éfer is spoken. When the .°dONLNd>6]B…(?]kNoSpeechInterrupt°dONLNdP6…Bœ)l fPÄ°dONLNdR6œB3)lag bit is set, howeverì °dONLNdi62BC)c, a reÄ°dONLNdn6CB‰)%equest to speak on a channel that is .°dONLNdìC]Oë(L]still busy pr⁄Ä°dONLNd†CëO˚)4ocessing a prior text bufæ°dONLNdπC˚O!)j
  483. fer will r£@°dONLNd√C!O])&esult in an errh °dONLNd“C^Og)=or‡°dONLNd‘CgO£)    . The new bufu†°dONLNd·C£O“)< fer is ignor.Ä°dONLNdÌC”O‡)0ed .°dONLNdP]\è(Y] and the errR`°dONLNd˚Pè\ö)2or R`°dONLNd˛Pö\Ë) synthNotReadyR`°dONLNd PË\¯)N is r$¿°dONLNdP¯\v)eturned. If the prior text buf˜ °dONLNd.Pu\Δ)}fer has been fully .°dONLNdA]]if(f]prG °dONLNdC]gi¬)
  484. ocessed, the new buf⁄@°dONLNdW]¬i%)[fer is spoken normally¿ °dONLNdm]$i))b. .°dONLNdpo]{q(x]The °dONLNdtoq{„)kPreflightThenPause°dONLNdáo„{Ï)r fl°dONLNdäoÏ{È)    8ag bit is used to minimize the latency experienced when °dONLNd¬|]à…(Ö]attempting to speak. OrR`°dONLNdŸ|…àH)ldinarily whenever a call to R`°dONLNdı|Hàä) SpeakStringR`°dONLNd|äàè)B, R`°dONLNd|èà≈)    SpeakTextR`°dONLNd |≈à’)6, or °dONLNdâ]ïü(í] SpeakBuffer°dONLNdâüïÈ)BJ is made, the speech synthesizer must perform a certain amount of initial ˇl◊#ˇ ˇˇˇˇ#◊
  485. ˇ·ˇ‚ˆA
  486. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  487. (ø˝23(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  488. °dONLNd;{GÑ(D{prG °dONLNd;ÖG√)
  489. ocessing befor°dONLNd;ƒG))?e speech output is hear܆°dONLNd';)GΩ)e#d. This startup latency can vary fr? °dONLNdJ;æGÈ)ï    om a few °dONLNdSH{T(Q{Wmilliseconds to several seconds depending upon which speech synthesizer is being used. °dONLNd™U{a‘*Recognizing that larr†°dONLNdæU‘aÌ)YAger startup delays may be detrimental to certain applications, a °dONLNdˇb{n√(k{mechanism is prÄ°dONLNdbƒn˙)I ovided to prö¿°dONLNdb˙nı)68ovide the synthesizer a chance to perform any necessary °dONLNdRo{{Ô(x{Rcomputations at noncritical times. Once the computations have been completed, the .°dONLNd§|{à    *!speech is able to start instantlyd@°dONLNd≈|à=)ç . When the ,
  490. Courierd@°dONLNd–|=àØ)5kPreflightThenPaused@°dONLNd„|Øà∏)r fld@°dONLNdÊ|∏à)    ag bit is set, the .°dONLNd˘â{ïÌ(í{speech synthesizer will prG¿°dONLNdâÓï )s3ocess the input text as necessary to the point wherÄ°dONLNdFâÀïË)›    e it is rw@°dONLNdOâËïˇ)eady °dONLNdTñ{¢´(ü{ to begin prô °dONLNd_ñ´¢)0oducing speech output. ™‡°dONLNdvñ¢)j9At this point, the synthesizer will enter a paused state °dONLNdØ£{Øí(¨{and r≤ °dONLNd¥£íØfl)eturn to the callerfi`°dONLNd«£flØS)M. When the application is r…`°dONLNd‚£SØÄ)t
  491. eady to prº‡°dONLNdÏ£ÄØ˚)-oduce speech, it should call .°dONLNd    ∞{ºç(π{the °dONLNd∞纷)ContinueSpeech°dONLNd∞·ºÁ)T rR`°dONLNd∞ÁºV)outine to begin speaking..°dONLNd7÷9flS(›9RESULëÄ°dONLNd<÷Sflw)T CODES
  492. 59>469= 797
  493. ˇ·ˇ‚ˆA °dONLNd (96Ø(29SpeechBusySystemW±@°dONLNd€(Ø6¿)videˇˇˇˇˇˇ(21
  494. .°dONLNd‡G{SÇ(P{Yï°dONLNd·GÅSÆ) ou can use ï°dONLNdÏGÆS&)-SpeechBusySystemWideï°dONLNdG&Sº)x# to determine if any speech is currg`°dONLNd#GºS)ñ ently being .°dONLNd/T{`<(]{+synthesized in your application or elsewherÃ`°dONLNdZT<`å)¡e on the computer>Ä°dONLNdkTå`é)P..°dONLNdmm{y…(v{pascal short °dONLNdzm…yq)NSpeechBusySystemWide (void);.°dONLNdóï9ûr(ú9 DESCRIPTION
  495. °dONLNd£¢{Æî+BThis r‹Ä°dONLNd©¢îÆE)'outine is useful when you want to ensur´@°dONLNd–¢FÆ´)≤e that no speech is curr˙@°dONLNdË¢´Æfi)e ently being .°dONLNdÙØ{ªÖ(∏{prR`°dONLNdˆØÖªœ)
  496. oduced anywher$¿°dONLNdØœªO)Je on the Macintosh computerg`°dONLNdØNªS). g`°dONLNd!ØSªÀ)SpeechBusySystemWideg`°dONLNd5ØÀª—)x r9¿°dONLNd7Ø—ª) eturns the °dONLNdBº{»(≈{total number of speech channel°dONLNd`º» )ãs°dONLNdaº ») currR`°dONLNdfº»›))ently synthesizing speech on the computerï°dONLNd躋»·)Ω, .°dONLNdë…{’…(“{whether they werî °dONLNd°……’ã)N,e initiated by your code or by some other pré@°dONLNdÕ…ã’—)¬ocess executing °dONLNd›÷{‚ù(fl{concurrf °dONLNd‰÷ù‚≥)"entlyü@°dONLNdÈ÷≤‚¥).°dONLNdν9S(9RESULëÄ°dONLNd˝Sw)T CODES
  497. °dONLNd¯
  498. {ì+(None
  499. 59<459; 6{6
  500. ˇ·ˇ‚ˆA °dONLNd˝'{5∏* Converting †¿°dONLNd'∏5ø)=T†¿°dONLNd    'æ5")ext Into Phonemesˇˇˇˇˇˇ‘@(11
  501. °dONLNd;{GÒ(D{YIn some situations it is desirable to convert a text string into its equivalent phonemic °dONLNduH{T~*rE°dONLNdvHTç)epr’¿°dONLNdyHçT∞)@esentation. This may be useful during the content development prà¿°dONLNdπH±T€(Q±
  502. ocess to fiv¿°dONLNdƒH‹T)+ne-tune °dONLNdÃU{aï(^{the pr§Ä°dONLNd“Uïa)onunciation of particular wor⁄‡°dONLNdÔUak)Çds or phrases. By fi› °dONLNdUka«)Trst converting the tarX¿°dONLNdU»a¯)] get phrase °dONLNd$b{n¸(k{Vinto phonemes, you can see what the synthesizer will try to speak. Then you need only °dONLNdzo{{å*corr`°dONLNd~oç{≠)?ect the parts that would not have been spoken the way you want..°dONLNdC‰{ô(Ì{noErr.°dONLNdI‰)ò0°dONLNdK‰,H)No errE†°dONLNdQ‰IR)or.°dONLNdUÔ{˚…(¯{synthNotReady.°dONLNdcÔ˚)â–242°dONLNdhÔ,˚Œ)(%Speech channel is still busy speaking.°dONLNdè˙{Á({invalidComponentID.°dONLNd¢˙ˇ)Ñ–3000.°dONLNd®˙,Q)-Invalid °dONLNd∞˙Qü)%SpeechChannel°dONLNdΩ˙ü—)N
  503.  parameterˇí◊#ˇ ˇˇˇˇ#◊
  504. ˇ·ˇ‚ˆA
  505. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  506. (ø24    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  507. IQÈ4IQÈ KKÔ
  508. ˇ·ˇ‚ˆA °dONLNd;I#(ET,Ä°dONLNd;"I9)extT◊@°dONLNd;8Iw)    oPhonemesˇˇˇˇˇˇ(E„1
  509. .°dONLNdZ]fq(c]The ,
  510. Courier°dONLNdZqf≈)TextToPhonemes°dONLNd"Z≈fÀ)T rR`°dONLNd$ZÀf±)3outine converts a designated text to phoneme codes.°dONLNdXs]´(|]pascal OSErr °dONLNdes´À)N0TextToPhonemes (SpeechChannel chan, Ptr textBuf,°dONLNdüÅˇç—+T# long textBytes, Handle phonemeBuf,°dONLNdÃèˇõ}* long *phonemeBytes);
  511. ©∏È4©∑È    .°dONLNd‚®]≥©(∞]Field descriptions
  512. ˇ·ˇ‚ˆA
  513. .°dONLNdıµ]¡u*chan.°dONLNd˙µπ¡÷)\Specifi‡°dONLNdµ÷¡ )c speech channel.°dONLNdƒ]–á(Õ]textBuf.°dONLNdƒπ–»)\Buf… °dONLNdƒ»–Ú) fer of text.°dONLNd)”]flì(‹]    textBytes°dONLNd3”πflÊ)\
  514. Length of °dONLNd=”Êfl)-textBuf°dONLNdD”fl5)*     in bytes°dONLNdN‚]Óô(Î]
  515. phonemeBuf.°dONLNdY‚πÓ»)\Buf… °dONLNd\‚»Ó)fer of phonemes.°dONLNdlÒ]˝´(˙]*phonemeBytes°dONLNdzÒπ˝)\Pointer to length of °dONLNdèÒ˝N)Y
  516. phonemeBuf°dONLNdôÒN˝s)<     in bytes.°dONLNd£ T( DESCRIPTION
  517. °dONLNdØ$]0·+BVIt may be useful to convert your text into phonemes during application development in °dONLNd1]=f*or∫Ä°dONLNd1f=≥)    der to be able to r“ °dONLNd1≥=<)Meduce the amount of memory r±Ä°dONLNd61<=S)âequir»¿°dONLNd;1S=fl)!ed to speak. If your application °dONLNd\>]Jâ(G]
  518. does not rf °dONLNdf>âJ†),equir}`°dONLNdk>†J»)Be the text-to-phoneme conversion portion of the speech synthesizer8@°dONLNd≠>»JÕ(G», °dONLNdØK]Wx(T]signifi˚°dONLNd∂KxWÈ)cantly less RAM may be r`°dONLNdŒKÍW)requir†°dONLNd”KW°)$ed to speak with some synthesizers. ± °dONLNd˜K°WŸ)† AdditionallyN°dONLNdKŸWfi)8, °dONLNdX]dñ(a]Eyou may be able to use a higher quality text-to-phoneme conversion pr}†°dONLNdJXñd›(añocess (even one °dONLNdZe]q¡(n]that does not work in rD@°dONLNdqe¬q()eeal time) to generate prɇ°dONLNdâe(qÂ)f*ecise phonemic information. This data can °dONLNd≥r]~+({].then be used with any speech synthesizer to prL†°dONLNd·r,~Ö)œoduce better speech..°dONLNdˆÑ]ê±(ç]TextToPhonemes°dONLNdѱê˙)T accepts a valid °dONLNdÑ˙êH)ISpeechChannel°dONLNd"ÑHêz)N
  519.  parameter¬†°dONLNd,ÑyêΔ)1, a pointer to the .°dONLNd?ë]ù†(ö]Jcharacters to be converted into phonemes, the length of the input text buf6†°dONLNdâë°ù‰(ö°fer in bytes, an °dONLNdöû]™‹(ß]Tapplication-supplied handle into which the converted phonemes can be written, and a .°dONLNdÓ´]∑≠*length parameter¬†°dONLNd˛´¨∑ƒ)O. On rï°dONLNd´ƒ∑Ú) eturn, the ï°dONLNd´Ú∑:). phonemeBytesï°dONLNd´:∑F)H arg`°dONLNd´F∑À) gument is set to the number of °dONLNd=∏]ƒ¯(¡] phoneme character bytes that werR`°dONLNd]∏¯ƒ7)õe written into R`°dONLNdl∏7ƒs)?
  520. phonemeBufR`°dONLNdv∏sƒ®)< . The data r$¿°dONLNdÇ∏®ƒŸ)5 eturned by ˇˇ÷ðdONLNdç≈]—±(Œ]TextToPhonemesˇˇÚD°dONLNdõ≈±—Ÿ)T
  521.  will corr6Ë°dONLNd•≈⁄—))    espond pr˚å°dONLNdÆ≈—Ë)*1ecisely to the phonemes that would be spoken had °dONLNdfl“]fi“(€]the input text been sent to °dONLNd˚““fi)u    SpeakText°dONLNd“fi1)6
  522.  instead. !†°dONLNd“1fiT))All currÙ°dONLNd“Sfi¨)"ent mode settings arΔ`°dONLNd*“¨fiÂ)Ye applied to ˇˇrD°dONLNd7fl]Î(Ë]%the converted speech. No callbacks ar祰dONLNd\flÎh)®e generated while the ˇ˛VÃVƒ°dONLNdrfliÎΩ)dTextToPhonemesˇˇrDVƒ°dONLNdÄflΩά)T rõh°dONLNdÇfl¬ÎË)
  523. outine is .°dONLNdåÏ]¯º(ı]generating its output.°dONLNd£5(RESULëÄ°dONLNd®5Y)T CODES
  524. v}È4v|È w]wÈ
  525. ˇ·ˇ‚ˆA °dONLNdéh]vΔ+(XGetting Information 1@°dONLNd¢hΔvÚ)iAbout a ·¿°dONLNd™hÚvJ),Speech Channelˇˇˇˇˇˇ‘@)1
  526. °dONLNd∫|]à‚(Ö]WSeveral additional types of information have been made available for advanced users of °dONLNdâ]ï∂*the Speech ManagerH¿°dONLNd#â∂ï)Y. This information pr‚¿°dONLNd8âïB)[
  527. ovides moró¿°dONLNdBâCï”)2"e detailed status information for .°dONLNdØ ],{()]noErr.°dONLNdµ Ù,˘)ó0°dONLNd∑ ,))No errE†°dONLNdΩ *,3)or.°dONLNd¡+]7ç(4]paramErr.°dONLNd +Í7˘)ç–50°dONLNdŒ+7Ä)#Parameter value is invalid.°dONLNdÍ6]B•(?] nilHandleErr.°dONLNd˜6ÂB˘)à–109.°dONLNd¸6B<)(    Handle arR`°dONLNd6<Bh)/
  528. gument is R`°dONLNd6hBz),nil°dONLNdA]M√(J]siUnknownInfoType.°dONLNd&AÂM˘)à–231°dONLNd+AM))(FeaturÁ@°dONLNd1A)Mæ) e not implemented on synthesizer.°dONLNdSL]X…(U]invalidComponentID.°dONLNdfL‡X˘)É–3000.°dONLNdlLX2)-Invalid °dONLNdtL2XÄ)%SpeechChannel°dONLNdÅLÄX≤)N
  529.  parameterˇ∏◊#ˇ ˇˇˇˇ#◊
  530. ˇ·ˇ‚ˆA
  531. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  532. (ø˝25(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  533. ˇˇfi.°dONLNd;{Gª(D{each channel. h°dONLNd;ºG√)AY#h°dONLNd;¬G{)+ou can get this information by calling the ,
  534. Courierˇˇö à°dONLNd:;|G )∫GetSpeechInfoˇˇfià°dONLNdG; Gœ)N r√Ï°dONLNdI;œG)outine. This .°dONLNdVH{T‚(Q{Rfunction accepts selectors that determine the type of information you want to get.
  535. b9p4c9p    °dONLNd©a{lé*Note
  536. ˇ·ˇ‚ˆA
  537. °dONLNdÆn{zä*Thr7 °dONLNd±nãz    )oughout this document, therh¿°dONLNdÃn    z)~e arw`°dONLNd–nzF) e several rWÄ°dONLNd€nFzV)-efer†°dONLNdflnWz¨)ences to parameter ˇˇÄ.°dONLNdÚz{Ü∏(É{values specifi°dONLNdzπÜÂ)>    ed with fi°dONLNd
  538. zÂÜW),xed-point integer values (ˇ˛Ä°dONLNd$zWÜo)rpbasˇˇÄ°dONLNd(zoÜs), ˇ˛Ä°dONLNd*ztÜå)pmodˇˇÄ°dONLNd.zåÜê), ˇ˛Ä°dONLNd0zêÜ®)rateˇˇÄ°dONLNd4z®Üø), and °dONLNd:Ü{íì(è{volm°dONLNd>Üìíñ)<). Unless otherwise stated, the full range of values of the °dONLNdzÜñí¥(èñFixed°dONLNdÜ¥í∂) .°dONLNdÄí{ûı(õ{data type is valid. However@ °dONLNdõíıûæ)z2, it is left to the individual speech synthesizer °dONLNdÕû{™Ö(ß{<implementation to determine whether or not to use the full rM‡°dONLNd    ûÜ™±(ßÜ
  539. esolution .°dONLNd™{∂Δ(≥{and range of the °dONLNd$™Δ∂‰)KFixed°dONLNd)™‰∂v)! data type. In the event a specifi°dONLNdK™v∂µ)íed parameter .°dONLNdX∂{¬ú(ø{Bvalue lies outside the range supported by a particular synthesizer˙†°dONLNdö∂õ¬∞(øõ, the °dONLNd†¬{Œt(À{;synthesizer will substitute the value closest to the specifi    ‡°dONLNd‹¬uŒ±)˙ed value that °dONLNdÍŒ{⁄"(◊{&does lie within its performance specifin†°dONLNdŒ#⁄D)®cations.,Zapf DingbatsÄ°dONLNd—JŸP)'u
  540.     94
  541. 9  9 
  542. ˇ·ˇ‚ˆA °dONLNd¸9
  543. ã(9GetSpeechInfoˇˇˇˇˇˇ(1
  544. .°dONLNd+{'è(${The °dONLNd/è'›)GetSpeechInfo°dONLNd<›'„)N rR`°dONLNd>„')outine r$¿°dONLNdF'˘)"5eturns information about a designated speech channel.°dONLNd|4{@…(={pascal OSErr °dONLNdâ4…@˚)N3GetSpeechInfo (SpeechChannel chan, OSType selector,°dONLNdΔBNè+T void *speechInfo);°dONLNd⁄Z9f](c9enum {°dONLNd·h9ti*soStatus°dONLNdÔh•t€)l    = 'stat',°dONLNd¸hÌtõ)H// gets speech output status °dONLNdv9Çi(9soErrors°dONLNd(v•Ç€)l    = 'erro',°dONLNd5vÌÇk)H// gets error status °dONLNdKÑ9ê{(ç9 soInputMode°dONLNd\Ñ•ê€)l    = 'inpt',°dONLNdiÑÌêß)H// gets current text/phon mode °dONLNdâí9ûì(õ9soCharacterMode°dONLNdûí•û€)l    = 'char',°dONLNd´íÌûß)H// gets current character mode °dONLNdÀ†9¨Å(©9 soNumberMode°dONLNd›†•¨€)l    = 'nmbr',°dONLNd̨͆ï)H// gets current number mode °dONLNdÆ9∫](∑9soRate°dONLNdÆ•∫€)l    = 'rate',°dONLNd ÆÌ∫°)H// gets current speaking rate °dONLNd?º9»{(≈9 soPitchBase°dONLNdPº•»€)l    = 'pbas',°dONLNd]ºÌ»ß)H// gets current baseline pitch °dONLNd} 9÷u(”9
  545. soPitchMod°dONLNdç •÷€)l    = 'pmod',°dONLNdö Ì÷≥)H!// gets current pitch modulation °dONLNdºÿ9‰o(·9    soVolume °dONLNdÀÿ•‰€)l    = 'volm',°dONLNdÿÿ̉≠)H // gets current speaking volume °dONLNd˘Ê9Ú{(Ô9 soSynthType°dONLNd
  546. Ê•Ú€)l    = 'vers',°dONLNdÊÌÚπ)H"// gets speech synth version info °dONLNd:Ù9Å(˝9 soRecentSync°dONLNdLÙ•€)l    = 'sync',°dONLNdYÙÌ—)H&// gets most recent sync message info °dONLNdÄ9ô( 9soPhonemeSymbols°dONLNdñ•·)l
  547. = 'phsy', °dONLNd§Ì≈)H$// gets phoneme symbols & ex. words °dONLNd…9ô(9soSynthExtension°dONLNdfl•’)l= 'xtnd'°dONLNdÎÌπ)H"// gets synthesizer-specific info °dONLNd9*E('9};
  548. 89G489F    .°dONLNd7{B«+BField descriptions
  549. ˇ·ˇ‚ˆA
  550. .°dONLNd$D{Pì*chan.°dONLNd)D◊PÙ)\Specifi‡°dONLNd0DÙP>)c speech channel.°dONLNdAS{_´(\{selector.°dONLNdJS◊_R)\Used to specify data being r£ °dONLNdfSR_y){equested.°dONLNdob{nΩ(k{ *speechInfo.°dONLNd{b◊nT)\Pointer to an information strZ °dONLNdòbUnl)~uctur‡°dONLNdùblnp)eˇº◊#ˇ ˇˇˇˇ#◊
  551. ˇ·ˇ‚ˆA
  552. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  553. (ø26    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ°dONLNd;DT(B DESCRIPTION
  554. °dONLNd I]Uœ+BWThe following list of selectors describes the various types of information that can be °dONLNdcV]bç* obtained fr˜Ä°dONLNdnVçb˜)0om the Speech Managerâ¿°dONLNdÉV˜bÜ)j!. The format of the information rø°dONLNd§VÜb·)èeturned depends on °dONLNd∑c]o¸(l]%which value is used in the selector fiw‡°dONLNd›c˝o>)†eld, as follows:
  555. }ãÈ4~ãÈ    °dONLNdÓ|]áp(Ñ]Note
  556. ˇ·ˇ‚ˆA
  557. °dONLNdÛâ]ïÖ*    For futur`¿°dONLNd¸âÖïfi)(e code compatibility“†°dONLNdâ›ïB)X, use the application prª¿°dONLNd(âBïx)e
  558. ogramming °dONLNd2ï]°I(û]:interface (API) labels instead of literal selector values.,Zapf Dingbats †°dONLNdmòO†U)Úu
  559. ¨ªÈ4≠ªÈ    °dONLNdo¨]∑©(¥]Field descriptions
  560. ˇ·ˇ‚ˆA
  561. °dONLNdÇπ]≈l*stat°dONLNdáππ≈®)\7Gets various items of status information for the specifi<Ä°dONLNdøπ©≈›) ed channel. °dONLNdÀ≈π—„(ŒπBIndicates whether any speech audio is being generated, whether or °dONLNd—π›‚* Bnot the channel has paused, how many bytes in the input text have °dONLNdO›πÈÎ* yet to be prk`°dONLNd[›ÎÈ‚)26ocessed, and the phoneme code for the phoneme that is .°dONLNdëÈπı (ÚπcurrR`°dONLNdïÈ ı:)ently being generated. If ,
  562. CourierR`°dONLNdØÈ:ıé)pinputBytesLeftR`°dONLNdΩÈéı–)T is 0, the input .°dONLNdŒıπ«(˛πbuf5°dONLNd—ı»≠)4fer is no longer needed and can be disposed of. The †°dONLNdı≠Á)ÂAPI label for ˇ˛ªJ.°dONLNdπ˘(
  563. πthis selector is ˇ¸1fi±fi°dONLNd$˘))@soStatusˇ˛ªJ±fi°dONLNd,),)0.°dONLNd4∑#ï( ∑%typedef SpeechStatusInfo *speechInfo;°dONLNd_%∑1}*!typedef struct SpeechStatusInfo {°dONLNdá3…?Û+Boolean°dONLNdë3ˇ?G)6 outputBusy; °dONLNd¢3Y?È)Z// true = audio playing °dONLNd¡A…MÛ(J…Boolean°dONLNdÀAˇMG)6 ouputPaused;ˇ˛Ã»°dONLNd‹AYMË)Z// true = channel paused °dONLNd¸O…[·(X…long°dONLNdOˇ[Y)6inputBytesLeft;ˇ˛Ã»°dONLNdOY[Ë)Z// bytes left to process °dONLNd7]…iÁ(f…short°dONLNd?]ˇiG)6 phonemeCode;°dONLNdP]YiÈ)Z// current phoneme code °dONLNdok∑w)(t∑} SpeechStatusInfo;°dONLNdÉÉ]èu(å]erro.°dONLNdàÉπè¯)\Gets saved err¥°dONLNdñɯèá)?!or information and clears the errı °dONLNd∑Éáèñ)èor r¢@°dONLNdªÉóè”)egisters. This °dONLNd èπõM(òπ$selector lets you poll for various rÆ`°dONLNdÓèMõ)î un-time err§`°dONLNd˘èõfi)2ors that occur during °dONLNdõπßø(§π9speaking, such as the detection of badly formed embedded °dONLNdHßπ≥¸* commands. Err @°dONLNdUß˝≥)Dors rı`°dONLNdZß≥B) eturned dir˚°dONLNdeßB≥∂)2ectly by Speech Manager rs@°dONLNd~ß∑≥Ÿ)uoutines .°dONLNdÜ≥πø√(ºπarR`°dONLNdà≥√øfi)
  564. e not r$¿°dONLNdè≥fiø) eported her˜ °dONLNdö≥ø0)4e. The ˜ °dONLNd°≥0øN)count˜ °dONLNd¶≥NøW) fi˜ °dONLNd©≥Wøƒ)    eld shows how many err…Ä°dONLNdø≥ƒø”)mors °dONLNd√øπÀÌ(»π have occurrR`°dONLNdŒøÌÀa)4ed since the last check. If R`°dONLNdÍøaÀ)tcountR`°dONLNdÔøÀæ) is 0 or 1, then R`°dONLNdøæÀ‚)?oldestR`°dONLNdø‚À‰)$ °dONLNdÀπ◊Ã(‘πand °dONLNd ÀÃ◊)newest°dONLNdÀ◊x)$ will be the same. Otherwise, °dONLNd/Àx◊ú)àoldest°dONLNd5Àú◊◊)$ contains the °dONLNdC◊π„Δ(‡πerrR`°dONLNdF◊Δ„4)or code for the oldest unr$¿°dONLNd`◊4„T)nead err˜ °dONLNdg◊S„q)or and ˜ °dONLNdn◊q„ï)newest˜ °dONLNdt◊ï„–)$ contains the °dONLNdÇ„πÔΔ(ÏπerrR`°dONLNdÖ„ΔÔ#)or code for the most r$¿°dONLNdõ„#ÔI)]    ecent err˜ °dONLNd§„HÔQ)%or9¿°dONLNd¶„QÔo)    . Both 9¿°dONLNd≠„oÔì)oldPos9¿°dONLNd≥„ìÔ®)$ and 9¿°dONLNd∏„®ÔÃ)newPos9¿°dONLNdæ„ÃÔŒ)$ .°dONLNdøÔπ˚h(¯π*contain the character positions of their rF °dONLNdÈÔi˚°)∞espective err$†°dONLNdˆÔ°˚Ã)8 ors in the °dONLNd˚π(πoriginal input text buf≥ °dONLNd˚&)afer‡°dONLNd˚&>) . The „@°dONLNd!˚=∏)API label for this selector is °dONLNd@πÈ(πsoErrors°dONLNdHÈÎ)0..°dONLNdP∑)è(&∑$typedef SpeechErrorInfo *speechInfo;°dONLNdz+∑7w* typedef struct SpeechErrorInfo {°dONLNd°9…EÁ+short°dONLNd©9ˇE))6count; °dONLNd≥95EÈ)6// # of errs since last check °dONLNdÿG…SÁ(P…OSErr°dONLNd‡GˇS))6oldest;°dONLNdÍG5Sø)6// oldest unread error °dONLNdU…a·(^…long°dONLNdUˇa))6oldPos;°dONLNdU5aÈ)6// char position of oldest err°dONLNd>c…oÁ(l…OSErr°dONLNdFcˇo))6newest;°dONLNdPc5o≥)6// most recent error °dONLNdlq…}·(z…long°dONLNdsqˇ}))6newPos;°dONLNd}q5}È)6// char position of newest err°dONLNd°∑ã#(à∑} SpeechErrorInfo;ˇ»◊#ˇ ˇˇˇˇ#◊
  565. ˇ·ˇ‚ˆA
  566. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  567. (ø˝27(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  568. Courier
  569. .°dONLNd;{Gì(D{inpt.°dONLNd;◊G)\Gets the currvÄ°dONLNd;Gs)9ent value of the text pr °dONLNd*;tGŒ)docessing mode contrw¿°dONLNd=;ŒGÓ)Zol. The °dONLNdEG◊S⁄(P◊rE°dONLNdFG€S7)eturned value specifiœ°dONLNd[G7Sñ)\es whether the specific °dONLNdqGóSÛ)`ed speech channel is .°dONLNdÜS◊_Ë(\◊currR`°dONLNdäSË_[)ently in text-input mode (R`°dONLNd§S[_s)sTEXTR`°dONLNd®Ss_Â)) or phoneme-input mode ˇ˛ÙX°dONLNd¿_◊k€(h◊(ˇ¸›°dONLNd¡_€kÛ)PHONˇ˛ÙX°dONLNd≈_Ûk)). The 
  570. P°dONLNdÃ_kà)API label for this selector is ˇ¸›ƒ`°dONLNdÎ_àk )z soInputModeˇ˛ÙXƒ`°dONLNdˆ_ kÕ)B.°dONLNd˛u’Åw(~’typedef OSType *speechInfo;°dONLNd#uâÅ„)¥// TEXT or PHON°dONLNd3ç{ôì(ñ{char.°dONLNd8ç◊ô)\Gets the currvÄ°dONLNdEçôã)9ent value of the character prD@°dONLNdbçåôÊ)|ocessing mode contr£‡°dONLNduçÊô)Zol. The °dONLNd}ô◊•⁄(¢◊rE°dONLNd~ô€•7)eturned value specifiœ°dONLNdìô7•ñ)\es whether the specific °dONLNd©ôó•Û)`ed speech channel is .°dONLNdæ•◊±Ë(Æ◊currR`°dONLNd¬•Ë± )ently pr$¿°dONLNd • ±…)$*ocessing input characters in normal mode ($¿°dONLNdÙ•…±·)ΩNORM$¿°dONLNd¯•·±˝)) or in ˇ˛L|°dONLNd±◊Ω(∫◊literal, letterû‹°dONLNd±Ω@)<
  571. -by-letter·|°dONLNd±?Ω^),, mode (ˇ˙Âtzt°dONLNd!±_Ωw) LTRLˇ˛L|zt°dONLNd%±wΩê)). The µ °dONLNd,±êΩ)API label for this selector is .°dONLNdKΩ◊…1(Δ◊soCharacterMode°dONLNdZΩ1…3)Z..°dONLNdb”’flw(‹’typedef OSType *speechInfo;°dONLNd~”wfl◊)¢// NORM or LTRL °dONLNdèÎ{˜ì(Ù{nmbr.°dONLNdîÎ◊˜)\Gets the currvÄ°dONLNd°Î˜Ü)9ent value of the number prëÄ°dONLNdªÎܘ‡)vocessing mode contrÒ °dONLNdŒÎ‡˜)Zol. The °dONLNd÷˜◊⁄(◊rE°dONLNd◊˜€7)eturned value specifiœ°dONLNdϘ7ñ)\es whether the specific °dONLNd˜óÛ)`ed speech channel is .°dONLNd◊Ë( ◊currR`°dONLNdË )ently pr$¿°dONLNd# ‚)$0ocessing input character digits in normal mode ($¿°dONLNdS‚˙)÷NORM$¿°dONLNdW˙)) °dONLNdY◊u(◊%or in literal, digit-by-digit, mode (°dONLNd~uç)ûLTRL°dONLNdÇç™)). The !†°dONLNd♸)API label for this °dONLNdú◊'($◊ selector is °dONLNd®'N)/ soNumberMode°dONLNd¥N'Q)H.°dONLNdª1’=w(:’typedef OSType *speechInfo;°dONLNd◊1w=◊)¢// NORM or LTRL °dONLNdËI{Uì(R{rate.°dONLNdÌI◊U)\Gets the currvÄ°dONLNd˙IU{)9ent speaking rate in wor~Ä°dONLNdI{Uı)kds per minute on the specifiH‡°dONLNd.IˆU){ed °dONLNd1U◊aJ(^◊channel. Speaking rates ar˙Ä°dONLNdKUJaW)se fiP‡°dONLNdOUXa∫)xed-point values. The  @°dONLNdeU∫a)bAPI label for this .°dONLNdxa◊m(j◊ selector is °dONLNdÑam*)/soRate°dONLNdäa*m-)$.°dONLNdëw’Éq(Ä’typedef Fixed *speechInfo;    .°dONLNd¨í◊ùÍ+Note
  572. °dONLNd±ü◊´·*Wï°dONLNd≤ü‡´È)    orœÄ°dONLNd¥üÈ´Ö)    %ds per minute is a convenient, if dif—†°dONLNdŸüÖ´ã)úfifi`°dONLNd€üã´∫) cult to defi*Ä°dONLNdÁüª´Î)0 ne, way of °dONLNdÚ´◊∑⁄(¥◊rE°dONLNdÛ´€∑È)epr’¿°dONLNdˆ´È∑Q)esenting speaking rate. Ɇ°dONLNd´Q∑è)hAlthough therFÄ°dONLNd´ê∑‚)?e is no universally °dONLNd/∑◊√(¿◊ accepted defiΔ °dONLNd<∑√J):nition of worL`°dONLNdI∑K√Î):#ds per minute, it does communicate °dONLNdl√◊œÎ(Ã◊apprI@°dONLNdp√Ïœ©)*oximate information about speaking rates. o¿°dONLNdö√©œ€)Ω
  573. Any specifiÖ†°dONLNd•√€œı)2c rate °dONLNd¨œ◊€˛(ÿ◊may corrÄ°dONLNd¥œˇ€9)(espond to difN °dONLNd¡œ9€E):fer0†°dONLNdƒœE€á) ent rates on dif:‡°dONLNd‘œá€ì)Bfer`°dONLNd◊œì€) ent synthesizers, but the °dONLNdÒ€◊Á4(‰◊two rates should be ro‡°dONLNd€4Áê)]easonably close. Mor¡°dONLNd€êÁÃ)\e importantly„ °dONLNd'€ÀÁ˙); , doubling °dONLNd2Á◊Û(◊Ethe rate on a particular synthesizer should halve the time needed to °dONLNdwÛ◊ˇ_* speak any particular utterance.,Zapf Dingbats=†°dONLNdóˆe˛k)éu
  574. .°dONLNdô{ì( {pbas.°dONLNdû◊)\Gets the currvÄ°dONLNd´õ)9!ent baseline pitch for the specifiC‡°dONLNdÕú˝)åed channel. The pitch °dONLNd„◊    (◊ value is a fiëÄ°dONLNd    ‡)21xed-point integer that conforms to the following °dONLNd!◊&fi(#◊frò‡°dONLNd#fi&    )    equency r‚ °dONLNd,    &?)+elationship: .°dONLNd?0’<≈(9’(Hertz = 440.0 * 2((BasePitch - 69) / 12)°dONLNdm>’J *    BasePitch°dONLNdv> J5)6 of 1.0°dONLNdÑ>SJX)H≈°dONLNdÜ>eJè)9 Hertz°dONLNdìL’X (U’    BasePitch°dONLNdúL X;)6 of 39.5°dONLNd´LSXX)H≈°dONLNd≠LeXï)80 Hertz°dONLNdªZ’f (c’    BasePitch°dONLNdƒZ f;)6 of 45.8°dONLNd”ZSfX)H≈°dONLNd’Zefõ)    115 Hertz°dONLNd‰h’t (q’    BasePitch°dONLNdÌh t;)6 of 50.4°dONLNd¸hStX)H≈°dONLNd˛hetõ)    150 Hertz°dONLNdv’Ç (’    BasePitch°dONLNdv ÇA)6     of 100.0°dONLNd&vSÇX)H≈°dONLNd(veÇ°)
  575. 2637 Hertzˇé◊#ˇ ˇˇˇˇ#◊
  576. ˇ·ˇ‚ˆA
  577. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  578. (ø28    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  579. Courier
  580. .°dONLNd;πGÔ(Dπ    BasePitch°dONLNd    ;ÔG)6
  581.  values arR`°dONLNd;G‘),)e always positive numbers in the range fr$¿°dONLNd<;‘G„)πom °dONLNd?GπS◊(Pπ1.0 thrR`°dONLNdFG◊S)ough 100.0. The Ù°dONLNdVGSü)GAPI label for this selector is Ù°dONLNduGüS·)Å soPitchBaseÙ°dONLNdÄG·S‰)B.°dONLNdá]∑iS(f∑typedef Fixed *speechInfo;°dONLNd¢u]Åu(~]pmod.°dONLNdßuπÅÚ)\Gets the currvÄ°dONLNd¥uÚÅ‘)93ent pitch modulation range for the speech channel. °dONLNdÁÅπç1(äπModulation values range fr9†°dONLNdÅ2ç^)y
  582. om 0.0 thr€‡°dONLNd Å^çí), ough 100.0. Z†°dONLNdÅìçö)5Aï@°dONLNdÅöç—) value of 0.0 °dONLNd&çπô (ñπcorr`°dONLNd*çÀô‰)=esponds to no modulation and means the channel will speak in .°dONLNdgôπ•(¢πa monotone. The !†°dONLNdwô•Ö)KAPI label for this selector is !†°dONLNdñôÖ•¡)Å
  583. soPitchMod!†°dONLNd†ô¡•Δ)<. .°dONLNd§®π¥⁄(±πNonzer§`°dONLNd™®⁄¥I)!o modulation values corrö°dONLNd¬®I¥™)oespond to pitch and fr1¿°dONLNdÿ®´¥“)bequency °dONLNd‡¥π¿(Ωπdeviations accor=†°dONLNd¥¿â)Hding to the following formula: .°dONLNd ∑÷è(”∑$Maximum pitch = BasePitch + PitchMod°dONLNd?ÿ∑‰è*$Minimum pitch = BasePitch - PitchMod°dONLNdiÊ∑Úe*Maximum Hertz = BaseHertz * 2°dONLNdÜ·eÌÀ(Íe(+ ModValue / 12)°dONLNdùÙ∑e(˝∑Minimum Hertz = BaseHertz * 2°dONLNd∫Ôe˚À(¯e(- ModValue / 12)°dONLNd—∑€( ∑Given:°dONLNdfi…/+BasePitch of 46.0°dONLNd˜Yj)ê(≈ °dONLNd˚k≠) 115 Hertz),°dONLNd…*)('…PitchMod of 2.0,°dONLNd#,∑8’(5∑Then:°dONLNd/:…F+Maximum pitch °dONLNd>:FA)T= 48.0°dONLNdK:YF¶)<(≈131 Hertz),°dONLNd_H…T(Q…Minimum pitch °dONLNdnHTA)T= 44.0°dONLNd{HYT†)< (≈104 Hertz)°dONLNdçV∑bS(_∑typedef Fixed *speechInfo;°dONLNd®n]zu(w]volm.°dONLNd≠nπzÚ)\Gets the currvÄ°dONLNd∫nÚzy)9ent setting of the volume contr∂@°dONLNdŸnyzæ)áol on the specifi&Ä°dONLNdÍnøzÃ)Fed °dONLNdÌzπÜÁ(Éπ
  584. channel. V2¿°dONLNd˜zÁÜ).    olumes ar∑`°dONLNdzÜ-)+e expr∫`°dONLNdz-ÜX)
  585. essed in fi©‡°dONLNdzYÜÀ),xed-point units ranging frÙ†°dONLNd+zÀÜ€)rom °dONLNd.Üπí’(èπ0.0 thrX¿°dONLNd5Ü’íˇ)
  586. ough 1.0. ◊Ä°dONLNd?ܡí)*A °dONLNd@ÜíP) value of 0.0 corrX@°dONLNdRÜPíÊ)I#esponds to silence, and a value of °dONLNduíπûŸ(õπ1.0 corr`°dONLNd}í⁄û°)!)esponds to the maximum possible volume. VH°dONLNd¶í†û‰)Δolume units lie °dONLNd∂ûπ™ò(ßπ5on a scale that is linear with amplitude or voltage. Q‡°dONLNdÎûò™ü)flAåÄ°dONLNdÏûü™◊) doubling of °dONLNd˘™π∂«(≥πper¿°dONLNd¸™»∂#)ceived loudness corrÒ¿°dONLNd™"∂‹)Z)esponds to a doubling of the volume. The .°dONLNd9∂π¬:(øπAPI label for this selector is °dONLNdX∂:¬j)ÅsoVolume°dONLNd`∂j¬m)0.°dONLNdgÃ∑ÿS(’∑typedef Fixed *speechInfo;°dONLNdlj]u(Ì]vers.°dONLNdá‰π–)\@Gets descriptive information for the type of speech synthesizer °dONLNd«π¸&* being used on the specifi÷°dONLNd‡&¸é)med speech channel. The C °dONLNd˜踋)iAPI label for this .°dONLNd
  587. ¸πË(π selector is °dONLNd¸Ë*)/ soSynthType°dONLNd!¸*-)B.°dONLNd(∑õ(∑&typedef SpeechVersionInfo *speechInfo;°dONLNdT ∑,É*"typedef struct SpeechVersionInfo {°dONLNd}.…:Ì+OSType°dONLNdÜ.ˇ:;)6
  588. synthType;°dONLNdñ.k:—)l// always 'ttsc' °dONLNdÆ<…HÌ(E…OSType°dONLNd∑<ˇHM)6synthSubType;°dONLNd <kHÀ)l// synth flavor °dONLNd·J…VÌ(S…OSType°dONLNdÍJˇVk)6synthManufacturer;°dONLNd˝JkV—)l// synth creator °dONLNdX…d·(a…long°dONLNdXˇdA)6 synthFlags;°dONLNd-Xkd≥)l // reserved °dONLNd@f…r(o…
  589. NumVersion°dONLNdMfrY)< synthVersion;°dONLNd_fYr_)T °dONLNdbfkr—)// synth version °dONLNdyt∑Ä/(}∑} SpeechVersionInfo;ˇÊ◊#ˇ ˇˇˇˇ#◊
  590. ˇ·ˇ‚ˆA
  591. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  592. (ø˝29(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  593. Courier
  594. .°dONLNd;{Gì(D{sync°dONLNd;◊G)\ Returns the °dONLNd;G%)6sync°dONLNd;%G†) message code for the most rR`°dONLNd1;†GÌ){ecently encounter$¿°dONLNdB;ÌG˙)Med °dONLNdEG◊S(P◊    embedded °dONLNdNGS)0sync°dONLNdRGSŸ)* command at the audio output point. If no °dONLNd|GŸSÒ)∫sync°dONLNdÄGÒSÛ) .°dONLNdÅS◊_[(\◊command has been encounterü¿°dONLNdõS[_)Ñ
  595. ed, 0 is roÄ°dONLNd•SÄ_˛)%eturned. Refer to the section °dONLNd√_◊kk(h◊“Embedded Speech Commands,””@°dONLNdfi_kk‚)î later in this document, for .°dONLNd˚k◊w*(t◊information about °dONLNdk*wB)Ssync°dONLNdkBwã) commands. The !†°dONLNd kãw)IAPI label for this selector °dONLNd<w◊É·(Ä◊is °dONLNd?w·É))
  596. soRecentSync°dONLNdKw)É,)H.°dONLNdRç’ôw(ñ’typedef OSType *speechInfo;°dONLNdn•{±ì(Æ{phsy.°dONLNds•◊±ø)\1Returns a list of phoneme symbols and example worò‡°dONLNd§•ø±‹)Ëds defic¿°dONLNd´•›±ˇ)ned for °dONLNd≥±◊Ω˘(∫◊the curr `°dONLNdª±˙Ω<)#ent synthesizer‡°dONLNd ±<ΩÕ)B!. The input parameter is the addr⁄@°dONLNdαÕΩÔ)ë    ess of a .°dONLNdÙΩ◊…:(Δ◊handle variable. On rR`°dONLNd    Ω:…h)c eturn, the R`°dONLNdΩh…Œ).PhonemeDescriptorR`°dONLNd%ΩŒ…)f  parameter .°dONLNd0…◊’§(“◊-contains a handle to the array of phoneme defi'Ä°dONLNd^…•’Ò)Œnitions. Make surÁ°dONLNdo…Ò’)Le to °dONLNdt’◊·o(fi◊!dispose of the handle when you arÍ¿°dONLNdï’o·)ò"e done using it. This information °dONLNd∑·◊Ì™(Í◊1is normally used to indicate to the user the apprÍÄ°dONLNdË·™ÌÚ)”oximate sounds °dONLNd˜Ì◊˘Ë(ˆ◊corr`°dONLNd˚ÌÈ˘◊)1esponding to various phonemes—an important featur} °dONLNd,Ì◊˘È)Óe in °dONLNd1˘◊H(◊international speech. The ’ °dONLNdK˘H√)qAPI label for this selector is .°dONLNdj◊7(◊soPhonemeSymbols°dONLNdz7:)`.°dONLNdÅ’'Ô($’/typedef PhonemeDescriptor ***speechInfo; // VAR°dONLNd√)ø5Ô+Í Handle °dONLNd—7’C}(@’typedef struct PhonemeInfo {°dONLNdÙEÁQ+short°dONLNd˚E Q5)$opcode;°dONLNdEAQ›)6// opcode for the phoneme °dONLNd&SÁ_(\ÁStr15°dONLNd-S _/)$phStr;°dONLNd6SA_Ô)6// corresponding char string °dONLNdZaÁm(jÁStr31°dONLNdaa mM)$ exampleStr;°dONLNdpaSmY)H °dONLNdraem˚)// word that shows use of°dONLNdôoe{ß* // phoneme °dONLNd´}Áâ(ÜÁshort°dONLNd≤} âS)$ hiliteStart;°dONLNd√}eâı)Z// part of example word °dONLNdÈãeóq*//°dONLNdÏãwó˚)to be hilighted as in °dONLNd    ôÁ•(¢Áshort°dONLNdô •G)$
  597. hiliteEnd;°dONLNdôe•Ô)Z// TextEdit selections °dONLNd<ß’≥)(∞’} PhonemeInfo;°dONLNdPµ’¡°*"typedef struct PhonemeDescriptor {°dONLNdy√Áœ+short°dONLNdÇ√/œ})HphonemeCount;°dONLNdê√}œÉ)N °dONLNdï√âœı)  // # of elements °dONLNdÆ—Á›)(⁄Á PhonemeInfo°dONLNdΩ—/›â)HthePhonemes[1];°dONLNd——â›Ô)Z // element list °dONLNdËfl’ÎM(Ë’} PhonemeDescriptor;°dONLNd˝˜{ì({xtnd.°dONLNd˜◊)\DThis call supports a general method for extending the functionality °dONLNdF◊;* of the Speech Managerí °dONLNd[;∏)d. It is used to get synthesizerÉ¿°dONLNdz∏◊)}-specifiE¿°dONLNdÇÿfi) c °dONLNdÑ◊c(◊ information. The format of the r5@°dONLNd§d¸)ç"eturned data is determined by the .°dONLNdΔ◊'ı($◊specifi°dONLNdÕı'm)c synthesizer queried. The °dONLNdËm'©)x
  598. speechInfo°dONLNdÚ©'µ)< arR`°dONLNdıµ') gument should be .°dONLNd'◊3&(0◊a pointer to the pr `°dONLNd''3_)Poper data str¸`°dONLNd&'^3u)7ucturÇ@°dONLNd+'v3æ)e. If a particular .°dONLNd>3◊?(<◊ synthCreator°dONLNdJ3?[)H value is not rR`°dONLNdY3[?›)<ecognized by the synthesizerï°dONLNdu3‹?Û)Å, the °dONLNd{?◊K$(H◊command is ignorR`°dONLNdã?$KV)M ed and the R`°dONLNdñ?VKº)2siUnknownInfoTypeR`°dONLNdß?ºKfi)f     code is °dONLNd∞K◊W€(T◊rR`°dONLNd±K€W)eturned. The Ù°dONLNdæKWñ):API label for this selector is Ù°dONLNd›KñWˆ)ÅsoSynthExtensionÙ°dONLNdÌKˆW˘)`.ˇ¢◊#ˇ ˇˇˇˇ#◊
  599. ˇ·ˇ‚ˆA
  600. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  601. (ø30    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  602. Courier
  603. .°dONLNd;∑Gâ(D∑#typedef SpeechXtndData *speechInfo;°dONLNd)I∑Uq*typedef struct SpeechXtndData {°dONLNdOW…cÌ+OSType°dONLNdXWˇcM)6synthCreator;°dONLNdfWMcÀ)N // synth creator ID °dONLNdÇe…q·(n…Byte°dONLNdâeˇqM)6synthData[2];°dONLNdóeMq—)N // data TBD by synth °dONLNd≥s∑(|∑} SpeechXtndData;.°dONLNd≈ö£5(°RESULëÄ°dONLNd ö5£Y)T CODES
  604. ÁÓÈ4ËÓÈ È]ÈÈ
  605. ˇ·ˇ‚ˆA °dONLNd`⁄]ËÔ+(CAdvanced Control Routinesˇˇˇˇˇˇ‘@(‰‚1
  606. °dONLNd{Û]ˇ≈(¸]The Speech Manager pr+†°dONLNdêÛΔˇ)i ovides numer@°dONLNdúÛˇ,)=    ous contr`°dONLNd•Û,ˇQ))    ol featur@°dONLNdÆÛQˇfi)%!es for sophisticated developers. °dONLNdœ] ê(    ] These contrć°dONLNd⁄ê x)34ols enable you to set various speaking parameters pr≠¿°dONLNdx ”)Ëogrammatically and °dONLNd!]f(]prG °dONLNd#g·)
  607. ovide a rich set of callback rφ°dONLNdA·›)z;outines that can be used to notify applications of various °dONLNd|]&Ú(#]!conditions within the speaking pr|°dONLNdùÚ&2)ïocess.  They arµ@°dONLNd¨2&Á)@'e extended by many speech synthesizers..°dONLNd‘,]8ê(5] These contrR`°dONLNdfl,ê8©)3ols ar$¿°dONLNdÂ,©8)e accessed with the $¿°dONLNd˘,8Q)ZSetSpeechInfo$¿°dONLNd,Q8W)N r˜ °dONLNd,V8w)outine. ò¿°dONLNd,w8≈)!All calls to this rk °dONLNd#,≈8„)Noutine °dONLNd*9]EÑ(B]    expect a °dONLNd39ÑE“)'SpeechChannel°dONLNd@9“E)N
  608.  parameter¬†°dONLNdJ9Eë)1", a selector to indicate the desirï°dONLNdl9ëE‚)éed function, and a .°dONLNdF]R⁄(O]Xpointer to some data. The format of this data depends on the particular selector and is °dONLNd◊S]_„*documented in the following r+°dONLNdÙS‰_7)áoutine description.
  609. èòÈ4êóÈ ëëÔ
  610. ˇ·ˇ‚ˆA °dONLNdÇêj(åSetSpeechInfoˇˇˇˇˇˇ(å„1
  611. .°dONLNd°]≠q(™]The °dONLNd°q≠ø)SetSpeechInfo°dONLNd(°ø≠≈)N rR`°dONLNd*°≈≠¡)8outine sets information for a designated speech channel.°dONLNdc∫]Δ´(√]pascal OSErr °dONLNdp∫´Δ›)N3SetSpeechInfo (SpeechChannel chan, OSType selector,°dONLNd•»o‘·(—o void *speechInfo);°dONLNdπ‡Ï?(Èenum {°dONLNdÀ‡ÛÏ})ÿ// Sets the parameter: °dONLNd‰Ó-˙o(˜- soInputMode°dONLNdˆÓ´˙·)~    = 'inpt',°dONLNdÓÛ˙è)H// current text/phon mode °dONLNd¸-á(-soCharacterMode°dONLNd5¸´·)~    = 'char',°dONLNdB¸Ûè)H// current character mode °dONLNd^
  612. -u(- soNumberMode°dONLNdq
  613. ´·)~    = 'nmbr',°dONLNd~
  614. Û})H// current number mode °dONLNdó-$Q(!-soRate°dONLNd§´$·)~    = 'rate',°dONLNd±Û$â)H// current speaking rate °dONLNdÃ&-2o(/- soPitchBase°dONLNdfi&´2·)~    = 'pbas',°dONLNdÎ&Û2è)H// current baseline pitch °dONLNd4-@i(=-
  615. soPitchMod°dONLNd4´@·)~    = 'pmod',°dONLNd%4Û@õ)H// current pitch modulation °dONLNdCB-Nc(K-    soVolume °dONLNdSB´N·)~    = 'volm',°dONLNd`BÛNï)H// current speaking volume °dONLNd}P-\Å(Y-soCurrentVoice°dONLNdíP´\·)~    = 'cvox',°dONLNdüPÛ\è)H// current speaking voice °dONLNdª^-jô(g-soCommandDelimiter°dONLNd‘^´j·)~    = 'dlim',°dONLNd·^Ûjw)H// command delimiters °dONLNd˘l-xW(u-soReset°dONLNdl´x·)~    = 'rset',°dONLNdlÛx≠)H// re channel to default state °dONLNd5z-Üo(É- soCurrentA5°dONLNdGz´Ü·)~    = 'myA5',°dONLNdTzÛÜâ)H// app's A5 on callbacks °dONLNdoà-î](ë-soRefCon°dONLNd~à´î·)~    = 'refc',°dONLNdãàÛîw)H// reference constant °dONLNd—®]¥{(±]noErr.°dONLNd◊®Ù¥˘)ó0°dONLNdŸ®¥))No errE†°dONLNdfl®*¥3)or.°dONLNd„≥]ø√(º]siUnknownInfoType.°dONLNdı≥Âø˘)à–231°dONLNd˙≥ø))(FeaturÁ@°dONLNd≥)ø»)#e is not implemented on synthesizer.°dONLNd%æ] …(«]invalidComponentID.°dONLNd8懠˘)É–3000.°dONLNd>æ 2)-Invalid °dONLNdFæ2 Ä)%SpeechChannel°dONLNdSæÄ ≤)N
  616.  parameterˇV◊#ˇ ˇˇˇˇ#◊
  617. ˇ·ˇ‚ˆA
  618. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  619. (ø˝31(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  620. Courier
  621. .°dONLNd;KG∑(DKsoTextDoneCallBack°dONLNd;…Gˇ)~    = 'tdcb',°dONLNd&;G≥)H// text done callback proc °dONLNdCIKU√(RKsoSpeechDoneCallBack°dONLNd^I…Uˇ)~    = 'sdcb',°dONLNdkIUÀ)H// end-of-speech callback proc °dONLNdåWKcü(`KsoSyncCallBack°dONLNd°W…cˇ)~    = 'sycb',°dONLNdÆWc≈)H// sync command callback proc °dONLNdŒeKq•(nKsoErrorCallBack°dONLNd‰e…qˇ)~    = 'ercb',°dONLNdÒeqõ)H// error callback proc °dONLNd
  622. sK±(|KsoPhonemeCallBack°dONLNd"s…ˇ)~    = 'phcb',°dONLNd/sß)H// phoneme callback proc °dONLNdJÅKçü(äKsoWordCallBack°dONLNd_Å…çˇ)~    = 'wdcb',°dONLNdlÅçï)H// word callback proc °dONLNdÑèKõ´(òKsoSynthExtension°dONLNdõè…õ˘)~= 'xtnd'°dONLNdßèõø)H// synthesizer-specific info °dONLNd≈ù9©E(¶9};
  623. ∂9≈4∑9≈    .°dONLNd»∂{¡«+BField descriptions
  624. ˇ·ˇ‚ˆA
  625. .°dONLNd€√{œì*chan.°dONLNd‡√◊œÙ)\Specifi‡°dONLNdÁ√Ùœ>)c speech channel.°dONLNd¯“{fi´(€{selector.°dONLNd“◊fiR)\Used to specify data being r£ °dONLNd“Rfiy){equested.°dONLNd&·{ÌΩ(Í{ *speechInfo.°dONLNd2·◊ÌT)\Pointer to an information strZ °dONLNdO·UÌl)~uctur‡°dONLNdT·lÌp)e°dONLNdV9r(9 DESCRIPTION
  626. °dONLNdb{ L+B2The following list of selectors outlines the contrò¿°dONLNdîL ı)—%ols available with the Speech ManagerÄ °dONLNdπı ˙)©. °dONLNdª!{-(*{The format of the information rµ@°dONLNd⁄!-˙)ä7eturned depends on which value is used in the selector °dONLNd.{:Å(7{fiå¿°dONLNd.Å:¬)eld, as follows:
  627. H9V4I9V    °dONLNd$G{Ré(O{Note
  628. ˇ·ˇ‚ˆA
  629. °dONLNd)T{`%*$The Speech Manager supports several ‡°dONLNdMT%`e)™callback featurY‡°dONLNd\Tf`°)Aes that can pr?`°dONLNdjT°`º);ovide °dONLNdp`{læ(i{Jthe sophisticated developer with a tight coupling to the speech synthesis °dONLNd∫l{xÑ* prG °dONLNdºlÖx )
  630. ocess. However˝ °dONLNd l…x\)D", these callbacks must be used carp†°dONLNdÏl]xv)îefullyŸ`°dONLNdÚluxõ)
  631. . Each is °dONLNd¸x{Ñ©(Å{
  632. invoked frb‡°dONLNdx©Ñ“).    om interr√`°dONLNdx“Ñ∫))3upt level. This means that you may not perform any °dONLNdBÑ{êt(ç{7operations that might cause memory to be allocated, pur4`°dONLNdyÑuê∫)˙ged, or moved. °dONLNdàê{ú-(ô{(Although application global variables arÒ@°dONLNd∞ê-úQ)≤    e also orê@°dONLNdπêRú∂)%dinarily not accessible .°dONLNd—ú{®°(•{    at interrl°dONLNd⁄ú°®fi)&upt time, the l°dONLNdËúfi®>)=soCurrentA5 myA5l°dONLNd¯ú>®Ø)` selector described in the .°dONLNd®{¥ì(±{?following text can be used to ask the Speech Manager to point r]†°dONLNdR®ì¥≤(±ìegister °dONLNdZ¥{¿®(Ω{GA5 at your application’s global variables prior to each callback. This °dONLNd°¿{Ã[* 6makes it fairly painless to access global variables frÏÄ°dONLNd◊¿[é)‡om your callback °dONLNdËÃ{ÿn(’{8handlers. If this information worries you, don’t despair°‡°dONLNd Ãnÿã)Û. Most °dONLNd'ÿ{‰È(·{information available thrƒ¿°dONLNd@ÿȉÅ)n$ough callbacks is also available thrpÄ°dONLNddÿlj¢)ôough a .°dONLNdk‰{…(Ì{GetSpeechInfo°dONLNdx‰…!)N call. These calls arR`°dONLNdç‰!9)Xe mor$¿°dONLNdí‰9∞)e friendly and do not come .°dONLNd≠{¸π(˘{Fwith the constraints imposed upon callback code. The only drawback is °dONLNdÛ¸{B* .that if you do not poll the information you arjÄ°dONLNd!¸B^)«e inter>‡°dONLNd(¸^ú)ested in often °dONLNd7{¨({Benough, you may miss some of the changes in your speech channel’s °dONLNdy{ ó* status.,Zapf Dingbats‡°dONLNdÅù£)"u
  633. +9:4,9:    °dONLNdÉ+{6«(3{Field descriptions
  634. ˇ·ˇ‚ˆA
  635. .°dONLNdñ8{Dì*inpt.°dONLNdõ8◊D)\Sets the curr °dONLNd®8Dq)7ent value of the text pr∂¿°dONLNd¿8qDÀ)cocessing mode contr`°dONLNd”8ÃDÏ)[ol. The °dONLNd€D◊P/(M◊passed value specifiØ°dONLNdÔD/P)X+es whether the speech channel should be in .°dONLNdP◊\%(Y◊text-input mode (°dONLNd+P%\=)NTEXT°dONLNd/P=\≥)) or phoneme-input mode (°dONLNdHP≥\À)vPHON°dONLNdLPÀ\Ó)    ). Input .°dONLNdU\◊h6(e◊mode changes take efb†°dONLNdi\6h«)_!fect as soon as possible; howeverΔ`°dONLNdä\ΔhÂ)ê, the pr͇°dONLNdí\Âh¸)ecise °dONLNdòh◊t{(q◊$latency is dependent upon the specifi¿°dONLNdΩh|t’)•c speech synthesizer% °dONLNd—h’tÌ)Y. The Ä°dONLNd◊hÌt)API .°dONLNd€t◊ÄD(}◊label for this selector is °dONLNdˆtDÄÜ)m soInputMode°dONLNd    tÜÄâ)B.°dONLNd    ä’ñ}(ì’typedef OSType *speechInfo; °dONLNd    %ä}ñ›)®// TEXT or PHON ˇp◊#ˇ ˇˇˇˇ#◊
  636. ˇ·ˇ‚ˆA
  637. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  638. (ø32    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  639. Courier
  640. .°dONLNd;]Gu(D]char.°dONLNd;πGÔ)\Sets the curr °dONLNd;Gk)7ent value of the character pr‚‡°dONLNd/;kG≈){ocessing mode contrBÄ°dONLNdB;ΔGÊ)[ol. The °dONLNdJGπS(Pπpassed value specifiØ°dONLNd^GS“)X+es whether the speech channel should be in ˇˇC.°dONLNdâSπ_(\πnormal character prÿà°dONLNdúS_S)Xocessing mode (ˇ˝…<^∞°dONLNd´ST_l)CNORMˇˇC^∞°dONLNdØSl_∏)) or literal, letter˙L°dONLNd√S∏_Â)L
  641. -by-letter<Ï°dONLNdÕSÂ_È)-, °dONLNdœ_πk◊(hπmode (°dONLNd’_◊kÔ)LTRL°dONLNdŸ_Ôkâ)!). Character mode changes take efR`°dONLNd˙_âk…)öfect as soon as .°dONLNd
  642. kπw(tπpossible; however†@°dONLNdkw')O, the prƒ¿°dONLNd#k'wΔ)$ecise latency is dependent upon the °dONLNdGwπÉ’(ÄπspecifiÓ °dONLNdNw’É.)c speech synthesizerÄ°dONLNdbw/ÉG)Z. The Ó‡°dONLNdhwFÉ¡)API label for this selector is .°dONLNdáÉπè(åπsoCharacterMode°dONLNdñÉè)Z.°dONLNdùô∑•_(¢∑typedef OSType *speechInfo; °dONLNd∫ô_•ø)®// NORM or LTRL °dONLNdÀ±]Ωu(∫]nmbr.°dONLNd–±πΩÔ)\Sets the curr °dONLNd›±Ωf)7ent value of the number pr0 °dONLNd˜±fΩ¿)vocessing mode contrè¿°dONLNd
  643. ±¿Ω‡)Zol. The °dONLNdΩπ…(Δπpassed value specifiØ°dONLNd&Ω…p)Xes whether the specifiC °dONLNd<Ωq…Â)`ed speech channel should .°dONLNdU…π’(“πbe in normal number prR`°dONLNdk…’b)eocessing mode (R`°dONLNdz…b’z)DNORMR`°dONLNd~…z’∫)) or in literal, °dONLNdè’π·(fiπdigit-by-digit, mode (°dONLNd•’·5)dLTRL°dONLNd©’5·‘)"). The number mode changes take efR`°dONLNdÀ’‘·Á)üfect .°dONLNd–·πÌ:(Íπas soon as possible. However†°dONLNdÏ·:ÌY)Å, the pr8 °dONLNdÙ·YÌË) ecise latency is dependent upon °dONLNdÌπ˘Â(ˆπ
  644. the specifiKÄ°dONLNdÌÊ˘?)-c speech synthesizern‡°dONLNd3Ì?˘W)Y. The L@°dONLNd9ÌW˘“)API label for this selector is .°dONLNdX˘π(π soNumberMode°dONLNdd˘)H.°dONLNdk∑_(∑typedef OSType *speechInfo; °dONLNdà_ø)®// NORM or LTRL °dONLNdô']3u(0]rate.°dONLNdû'π38)\Sets the speaking rate in worê¿°dONLNdª'83≤)ds per minute on the specifi[ °dONLNd◊'≥3Á){ ed channel. °dONLNd„3π?(<πSpeaking rates ard °dONLNdÙ3?)Le fi∫Ä°dONLNd¯3?`)xed-point values. N °dONLNd
  645. 3a?ô)OAll values arGÄ°dONLNd3ô?‚)8e valid; however0Ä°dONLNd'3‚?Á)I, °dONLNd)?πK’(HπspecifiÓ °dONLNd0?’KÕ)<c synthesizers will not necessarily be able to speak at all .°dONLNdlKπW(Tπpossible rates. The !†°dONLNdÄKWë)WAPI label for this selector is !†°dONLNdüKëWµ)ÅsoRate!†°dONLNd•KµW∏)$.°dONLNd¨a∑mS(j∑typedef Fixed *speechInfo;°dONLNd«y]Öu(Ç]pbas.°dONLNdÃyπÖ)\Changes the curr€‡°dONLNd‹yÖè)K!ent baseline pitch for the specifi©@°dONLNd˛yêÖÿ)åed channel. The °dONLNdÖπë(éπpitch value is a fi°dONLNd!Öë€)K1xed-point integer that conforms to the following °dONLNdRëπù¿(öπfrò‡°dONLNdTë¿ùÎ)    equency r‚ °dONLNd]ëÎù)+ elationship:.°dONLNdoß∑≥ß(∞∑(Hertz = 440.0 * 2((BasePitch - 69) / 12)°dONLNdùµ∑¡*BasePitch of 1.0°dONLNd¥µ5¡:)~≈°dONLNd∂µG¡q)9 Hertz°dONLNd√√∑œ(Ã∑BasePitch of 39.5°dONLNd€√5œ:)~≈°dONLNd›√Gœw)80 Hertz°dONLNdΗ∑›(⁄∑BasePitch of 45.8°dONLNd—5›@)~≈ °dONLNd—G›})    115 Hertz°dONLNdfl∑Î(Ë∑BasePitch of 50.4°dONLNd-fl5Î:)~≈°dONLNd/flGÎ})    150 Hertz°dONLNd>Ì∑˘#(ˆ∑BasePitch of 100.0°dONLNdWÌ5˘:)~≈°dONLNdYÌG˘É)
  646. 2637 Hertz°dONLNdeπÔ(π    BasePitch°dONLNdnÔ)6
  647.  values arR`°dONLNdx‘),)e always positive numbers in the range fr$¿°dONLNd°‘„)πom .°dONLNd§π’(π1.0 thrX¿°dONLNd´’) ough 100.0..°dONLNdº'∑3S(0∑typedef Fixed *speechInfo;°dONLNdÿ?πKÕ+The !†°dONLNd‹?ÕKN)API label for this selector is !†°dONLNd˚?NKê)Å soPitchBase!†°dONLNd?êKì)B.°dONLNdN]Zu(W]pmod.°dONLNdNπZ)\Changes the curr€‡°dONLNdNZÊ)K3ent pitch modulation range for the speech channel. °dONLNdPZπf1(cπModulation values range fr9†°dONLNdjZ2f^)y
  648. om 0.0 thr€‡°dONLNdtZ^fí), ough 100.0. Z†°dONLNdÄZìfö)5Aï@°dONLNdÅZöf—) value of 0.0 °dONLNdèfπr (oπcorr`°dONLNdìfÀr‰)=esponds to no modulation and means the channel will speak in °dONLNd–rπ~({πa monotone. Nonzer†°dONLNd‚r~É)[o modulation values corr˝@°dONLNd˙rÇ~‹)nespond to pitch and °dONLNd~πä¿(áπfrò‡°dONLNd~¿ä/)equency deviations accor⁄¿°dONLNd(~/ä¥)oding to the following formula:ˇ◊#ˇ ˇˇˇˇ#◊
  649. ˇ·ˇ‚ˆA
  650. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  651. (ø˝33(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  652. Courier
  653. .°dONLNd;’G#(D’Maximum pitch°dONLNd;/G≥)Z= BasePitch + PitchMod°dONLNd.I’U#(R’Minimum pitch°dONLNd@I/U≥)Z= BasePitch - PitchMod°dONLNd\W’c#(`’Maximum Hertz°dONLNdnW/câ)Z= BaseHertz * 2°dONLNd}Râ^Ô([â(+ ModValue / 12)°dONLNdîe’qâ(n’Minimum Hertz  = BaseHertz * 2°dONLNd≤`âlÔ(iâ(- ModValue / 12)°dONLNd…s’(|’Given : °dONLNdÿÅÁçM+BasePitch of 46.0°dONLNdÅeç≤)~(≈115 Hertz),°dONLNdèÁõG(òÁPitchMod of 2.0,°dONLNdù’©Û(¶’Then:°dONLNd&´Á∑;+Maximum pitch °dONLNd6´;∑_)T= 48.0°dONLNdA´e∑≤)*(≈131 Hertz),°dONLNdUπÁ≈;(¬ÁMinimum pitch °dONLNddπ;≈_)T= 46.0°dONLNdpπe≈¨)* (≈104 Hertz)°dONLNdÉ’’·q(fi’typedef Fixed *speechInfo;°dONLNdüÌ◊˘Î+The !†°dONLNd£Ì΢l)API label for this selector is !†°dONLNd¬Ìl˘®)Å
  654. soPitchMod!†°dONLNdÃÌ®˘´)<.°dONLNdŒ¸{ì({volm.°dONLNd”¸◊")\Changes the curr€‡°dONLNd„¸"ª)K!ent speaking volume on the specifiU@°dONLNd¸º)ö ed channel. °dONLNd◊fi(◊Vú`°dONLNd›)    olumes ar!°dONLNd    $),e expr$°dONLNd!$O)
  655. essed in fiÄ°dONLNd,P¬),xed-point units ranging fr^@°dONLNdF¬·)rom 0.0 °dONLNdM◊ ‰(◊thrX¿°dONLNdP‰ ) ough 1.0 . WÄ°dONLNd[ )-Aí °dONLNd\ a) value of 0.0 corrÿ@°dONLNdna ˜)I#esponds to silence, and a value of °dONLNdë ◊,˜()◊1.0 corr`°dONLNdô ¯,ø)!)esponds to the maximum possible volume. VH°dONLNd¬ æ,)Δolume units lie °dONLNd“,◊8∂(5◊5on a scale that is linear with amplitude or voltage. Q‡°dONLNd,∂8Ω)flAåÄ°dONLNd,Ω8ı) doubling of °dONLNd8◊DÂ(A◊per¿°dONLNd8ÊDA)ceived loudness corrÒ¿°dONLNd,8@D˙)Z)esponds to a doubling of the volume. The .°dONLNdUD◊PX(M◊API label for this selector is °dONLNdtDXPà)ÅsoVolume°dONLNd|DàPã)0.°dONLNdÉZ’fq(c’typedef Fixed *speechInfo;°dONLNdûr{~ì({{cvox.°dONLNd£r◊~")\Changes the curr€‡°dONLNd≥r"~|)Kent voice on the currJÄ°dONLNd»r}~Ó)[ent speech channel to the °dONLNd‚~◊äÛ(á◊specifiÓ °dONLNdÈ~Ûär)ed voice. Note that this contr/†°dONLNd~säß)Äol call will r#†°dONLNd~ßäŒ)4    eturn an .°dONLNdä◊ñ=(ì◊incompatibleVoice°dONLNd/ä=ñL)f errR`°dONLNd3äLñé)or if the specif"‡°dONLNdCäéñ)Bied voice is incompatible .°dONLNd]ñ◊¢(ü◊Dwith the speech synthesizer associated with the speech channel. The .°dONLNd°¢◊ÆX* API label for this selector is °dONLNd¿¢Xƨ)ÅsoCurrentVoice°dONLNdŒ¢¨ÆØ)T.°dONLNd’∏’ƒâ(¡’typedef VoiceSpec *speechInfo;°dONLNdÙ–{‹ì(Ÿ{dlim.°dONLNd˘–◊‹˚)\@Sets the delimiter character strings for embedded commands. The °dONLNd9‹◊ˈ* <start of an embedded command is determined by comparing the °dONLNduË◊Ù¯* Binput characters to the start-command delimiter string. Likewise, °dONLNd∑Ù◊Ê* :the end of a command is determined by comparing the input °dONLNdÒ◊ ‡* 8characters to the end-command delimiter string. Command °dONLNd) ◊+* delimiter strings arÆ°dONLNd= +Ú)T2e either 1 or 2 bytes in length. If a single byte °dONLNdo◊$!(!◊delimiter is desirÊ@°dONLNdÅ!$‡)J.ed, it should be followed by a null (0) byte. °dONLNdØ$◊0m(-◊!Delimiter characters must come friÄ°dONLNd–$m0)ñ$om the set of printable characters. °dONLNdÙ0◊<D(9◊If the delimiter strings ar=¿°dONLNd0E<h)ne empty‹‡°dONLNd0g<¬)", this will have the ef4†°dONLNd-0√<‡)\fect of °dONLNd5<◊Hl(E◊disabling embedded command prG¿°dONLNdR<mHß)ñocessing. Carñ°dONLNd_<ßHˇ):e must be taken not °dONLNdsH◊T˛(Q◊Fto choose delimiter strings that might occur naturally in the text to ˇˇ≠¿.°dONLNdπT◊`* be spoken. The *‡°dONLNd»T`ô)CAPI label for this selector is ˇˇ    @=`°dONLNdÁTô`)soCommandDelimiterˇˇ≠¿°dONLNd˘T`)k.ˇ◊#ˇ ˇˇˇˇ#◊
  656. ˇ·ˇ‚ˆA
  657. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  658. (ø34    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  659. Courier
  660. .°dONLNd;∑G·(D∑typedef°dONLNd    ;·GÁ)* °dONLNd ;ÌGâ) DelimiterInfo *speechInfo;°dONLNd+I∑U·(R∑typedef°dONLNd4I·UÁ)* °dONLNd6IÌUq) struct DelimiterInfo {°dONLNdRW∑cœ(`∑Byte°dONLNdXW€c·)$ °dONLNdZWÌcY)startDelimiter[2];°dONLNdqWYc_)l °dONLNdtWkc„)// defaults to "[[" °dONLNdée∑qœ(n∑Byte°dONLNdîe€q·)$ °dONLNdñeÌqM)endDelimiter[2];°dONLNd≠ekq„)~// defaults to "]]" °dONLNd«s∑(|∑} DelimiterInfo;°dONLNdÿã]óu(î]rset°dONLNd›ãπó¢)\5Resets the speech channel to its default states. The °dONLNdã¢ófi)È
  661. speechInfo°dONLNdãfió‡)< .°dONLNdóπ£X(†π$parameter should be set to 0. Specifi„ °dONLNdBóX£∑)üc synthesizers may pró °dONLNdWó∏£”)`ovide ˇˇ⁄Ã.°dONLNd]£πØ◊(¨πother r-,°dONLNdd£ÿØ<)eset capabilities. The _0°dONLNd{£<غ)dAPI label for this selector is ˇˇêd¯°dONLNdö£ºØÊ)ÄsoResetˇˇ⁄ï°dONLNd°£ÊØÈ)*.°dONLNd®π∑≈M(¬∑typedef long *speechInfo;°dONLNd¬—]›u(⁄]myA5.°dONLNd«—π›Y)\&An application uses this selector to r£†°dONLNdÌ—Y›º)†equest that the speech °dONLNd›πÈ(Êπsynthesizer set up an °¿°dONLNd›È∑)_&A5 world prior to all callbacks. In oriÄ°dONLNd@›∏ÈÂ)† der for an °dONLNdKÈπı (ÚπCapplication to access any of its global data, it is necessary that °dONLNdéıπº* rE°dONLNdèıΩ‹)egister „`°dONLNdóı‹0)A5 contain the corrX†°dONLNd™ı1‘)U(ect value, since all global variables arœÄ°dONLNd“ı‘€)£e °dONLNd‘πº(
  662. πrE°dONLNd’ΩÕ)eferÒ °dONLNdŸÕÌ)enced r&¿°dONLNd‡Ó)! elative to r@°dONLNdÏ;).egister 醰dONLNdÙ<Á) (A5. If you pass a non-null value in the ˇ˛m .°dONLNdπı(π
  663. speechInfoˇˇyÓ°dONLNd&ı&)<
  664.  parameter<é°dONLNd0&∫)1#, the speech synthesizer will set rÍÇ°dONLNdS∫⁄)îegister °dONLNd[€È)!A5 .°dONLNd^π%("πto this value just beforç@°dONLNdv%†)b!e it calls one of your callback r‰‡°dONLNdó†%ÿ)Öoutines. The A†°dONLNd§Ÿ%Ë)9A5 °dONLNdß%π1º(.πrE°dONLNd®%Ω1Í) egister is r¨ °dONLNd¥%Í1ˇ)-estor/†°dONLNdπ%1¬)-ed to its original value when your callback rdÄ°dONLNdÊ%¬1‡)¬outine .°dONLNdÌ1π=Ω(:πrR`°dONLNdÓ1Ω=Ò) eturns. The Ù°dONLNd˙1=q)3API label for this selector is Ù°dONLNd1q=≥)Å soCurrentA5Ù°dONLNd$1≥=∂)B.°dONLNd+G∑SA(P∑typedef Ptr speechInfo;ˇˇ'®°dONLNdD_πk¡+AÛ`°dONLNdE_¿kÅ), typical application would make the call to ˇ˝v¯0†°dONLNdq_Çk–)¬SetSpeechInfoˇˇ'®0†°dONLNd~_–kÈ)N with .°dONLNdÑkπw (tπcode like the following:.°dONLNd¢Å∑ç;(ä∑myA5 = SetCurrentA5();°dONLNdæè∑õ„*2err = SetSpeechInfo (mySpeechChannel, soCurrentA5,°dONLNd¯ù€©+$ myA5);°dONLNdµ]¡u(æ]refc.°dONLNdµπ¡·)\
  665. Sets the r´ °dONLNdµ·¡Ò)(eferW@°dONLNdµÚ¡£)(ence constant associated with the specifi‡°dONLNd<µ§¡ÿ)≤ ed channel. ¢@°dONLNdHµÿ¡Ë)4All °dONLNdL¡πÕp( π+callbacks generated for this channel will rÛ¿°dONLNdw¡pÕ°)∑ eturn this r…°dONLNdÉ¡°Õ±)1eferu °dONLNdá¡≤Õ»)ence °dONLNdåÕπŸ”(÷πBconstant for use by the application. The application can use this °dONLNdŒŸπÂB* value any way it wants to. The ¿°dONLNdÌŸCÂæ)äAPI label for this selector is .°dONLNd ÂπÒÈ(ÓπsoRefCon°dONLNdÂÈÒÏ)0.°dONLNd˚∑M(∑typedef long *speechInfo;°dONLNd5]u(]tdcb.°dONLNd:πî)\4Enables the callback that signals that text input pr$ °dONLNdnï·)‹ocessing is done. °dONLNdÄπ+ø((πY@Ä°dONLNdÅø+˚)our callback r<¿°dONLNdè˚+à)<outine is invoked when the curr>@°dONLNdÆà+ß)çent bufP†°dONLNdµß+€)fer of input °dONLNd¬+π7˛(4πtext has been pr8¿°dONLNd“+ˇ7Œ)F.ocessed and is no longer needed by the speech °dONLNd7πCÎ(@π synthesizer °dONLNd 7ÎC‹)2:. This callback does not indicate that the synthesizer is ˇˇff.°dONLNdECπO¿(Lπfi°dONLNdGC¿OT)"nished speaking the text (see the ˇ˛32Êd°dONLNdiCTOl)îsdcbˇˇffÊd°dONLNdmClOË) callback description, next), .°dONLNdãOπ[ (Xπmer‚†°dONLNdéO [u))ely that the input text has been fully prP@°dONLNd∑Ov[‰)¨ocessed and is no longer °dONLNd–[πgL(dπ needed by the speech synthesizerç°dONLNd[Lg·)ì#. This callback can be disabled by .°dONLNdgπs˘(pπpassing a null °dONLNd"g˘s#)@ProcPtr°dONLNd)g#sB)* in the °dONLNd1gBs~)
  666. speechInfo°dONLNd;g~s∞)<
  667.  parameter¬†°dONLNdEgØsË)1 . When your .°dONLNdQsπ„(|π
  668. callback rç°dONLNd[s„’)*8outine is invoked, you have two options. If you set the .°dONLNdìπã„(àπnextBuf°dONLNdö„ãË)*, °dONLNdúËã)byteLen°dONLNd£ã*)*, and °dONLNd©*ãr) controlFlags°dONLNdµrãπ)H variables beforR`°dONLNd≈πã¿)Ge .°dONLNd«ãπóº(îπrE°dONLNd»ãΩó»)=eturning, you will enable the speech synthesizer to continue ˇh◊#ˇ ˇˇˇˇ#◊
  669. ˇ·ˇ‚ˆA
  670. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  671. (ø˝35(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  672. °dONLNd;◊GR(D◊speaking without any interrÍ`°dONLNd;RGÏ){%uption in the output. If you set the ,
  673. Courier.°dONLNd@G◊S(P◊nextBuf°dONLNdGGSs)* parameter to null, you arR`°dONLNdaGsS˙)re indicating that you have no °dONLNdS◊_Ë(\◊morR`°dONLNdÇSË_B)e text to speak. The R`°dONLNdóSB_ä)Z controlFlagsR`°dONLNd£Sä_⁄)H parameter is defiR`°dONLNdµS⁄_)P
  674. ned as in °dONLNdø_◊k(h◊ SpeakBuffer¬†°dONLNd _k1)A. The d@°dONLNd–_1k≤)API label for this selector is °dONLNdÔk◊wC(t◊soTextDoneCallBack°dONLNdkCwF)l.°dONLNdÅ’ç_(ä’typedef Ptr speechInfo;°dONLNd%è’õÈ*.pascal void MyInputDoneCallback (SpeechChannel°dONLNdZùÁ©≠+! chan, long refCon, Ptr *nextBuf,°dONLNdÇ´Á∑ø*$ long *byteLen, long *controlFlags);°dONLNdß√{œì(Ã{sdcb.°dONLNd¨√◊œr)\#Enables an end-of-speech callback.  `°dONLNdœ√sœy)úYÀ‡°dONLNd–√xœ¥)our callback r» °dONLNdfi√¥œ˘)<outine is called °dONLNdÔœ◊€K(ÿ◊whenever an input text str†°dONLNd    œL€«)ueam has been completely prR`°dONLNd#œ«€˛){ ocessed and °dONLNd/€◊ÁZ(‰◊spoken. When your callback r÷Ä°dONLNdK€ZÁ˛)É&outine is invoked, you can be certain °dONLNdqÁ◊Û(◊Ethat the speech channel is now idle and no audio is being generated. .°dONLNd∂Û◊ˇ´* 0This callback can be disabled by passing a null °dONLNdÊÛ´ˇ’)‘ProcPtr°dONLNdÌÛ’ˇÙ)* in the °dONLNdıˇ◊ (◊
  675. speechInfo°dONLNdˇˇ E)<
  676.  parameter¬†°dONLNd    ˇD ])1. The d@°dONLNdˇ] fi)API label for this selector is °dONLNd. ◊O(◊soSpeechDoneCallBack°dONLNdB OR)x.°dONLNdI!’-_(*’typedef Ptr speechInfo;°dONLNdf/’;ı*0pascal void MyEndOfSpeechCallback (SpeechChannel°dONLNdù=ÁI_+ chan, long refCon);°dONLNd≤U{aì(^{sycb°dONLNd∑U◊a)\ Enables the °dONLNd√Ua&)7sync°dONLNd«U&aÄ) command callback. R`°dONLNd⁄UÄaá)ZYg`°dONLNd€UÜa√)our callback r9¿°dONLNdÈU√aÎ)=
  677. outine is °dONLNdÛa◊mu(j◊"invoked when the text following a °dONLNdaumç)ûsync°dONLNdaçmı) embedded command is .°dONLNd.m◊yˇ(v◊Dabout to be spoken. This callback can be disabled by passing a null .°dONLNdry◊Ö* ProcPtr°dONLNdyyÖ )* in the °dONLNdÅy Ö\)
  678. speechInfo°dONLNdãy\Öé)<
  679.  parameter¬†°dONLNdïyçÖ§)1. See ¬†°dONLNdõy§Ö˝)“Embedded Speech .°dONLNd¨Ö◊ë(é◊
  680. Commands,”^†°dONLNd∂Öë);9 later in this document, for a description of how to use .°dONLNdÔë◊ùÔ(ö◊sync°dONLNdÛëÔù8) commands. The !†°dONLNdë8ùπ)IAPI label for this selector is °dONLNd!ù◊©+(¶◊soSyncCallBack°dONLNd/ù+©.)T.°dONLNd6≥’ø_(º’typedef Ptr speechInfo;°dONLNdS¡’Õı*0pascal void MySyncCommandCallback (SpeechChannel°dONLNdäœÁ€◊+( chan, long refCon, OSType syncMessage);°dONLNd≥Á{Ûì({ercb.°dONLNd∏Á◊Û)\ Enables err°dONLNd√ÁÛ@)1or callbacks. §Ä°dONLNd—ÁAÛG)9Ye°dONLNd“ÁGÛÉ)our callback ra@°dONLNd‡ÁÉÛ)<outine is called whenever an °dONLNd˝Û◊ˇ„(¸◊err@°dONLNdÛ‰ˇJ)or occurs during the pr˘°dONLNdÛIˇ¬)eocessing of an input text strF¿°dONLNd4Û√ˇË)zeam. Err∑¿°dONLNd<Ûˡ¯)%ors °dONLNd@ˇ◊ Ï(◊can r†°dONLNdEˇÌ  )esult frÿ°dONLNdMˇ  E) om syntax prÒ °dONLNdYˇE …):oblems in the input text, insufˇ°dONLNdxˇ… œ)Ñfiı†°dONLNdzˇœ ˛)
  681. cient CPU °dONLNdÑ ◊‡(◊prG °dONLNdÜ ·©)
  682. ,ocessing speed (such as an audio data underr}Ä°dONLNd≤ ©‚)»un), or other °dONLNd¿◊#◊( ◊9conditions that may arise during the speech conversion pr!Ä°dONLNd˘ÿ#˝( ÿ
  683. ocess. If °dONLNd#◊/„(,◊err@°dONLNd#‰/∑)/or callbacks have not been enabled, when an err´Ä°dONLNd5#∑/˘)”or condition is °dONLNdE/◊;—(8◊9detected, the Speech Manager will save its value. The err–†°dONLNd~/—;¯)˙    or codes .°dONLNdá;◊G(D◊can then be rR`°dONLNdî;GM)8ead using the R`°dONLNd¢;MGõ)>GetSpeechInfoR`°dONLNdØ;õGfl)N status selector °dONLNd¿G◊S(P◊soErrors°dONLNd»GS)0 (°dONLNd GS%)erro°dONLNdŒG%SO)
  684. ). The errR`°dONLNdÿGOS)*)or callback can be disabled by passing a ˇˇé(°dONLNdS◊_Í(\◊null ˇ˛™x(°dONLNdSÎ_)ProcPtrˇˇé((°dONLNdS_2)* in the ˇ˛™x∏†°dONLNdS2_n)
  685. speechInfoˇˇé(∏†°dONLNdSn_ü)<
  686.  parameterâh°dONLNd)Sü_∑)1. The GX°dONLNd/S∑_)API label for this °dONLNdB_◊k(h◊ selector is °dONLNdN_k`)/soErrorCallBack°dONLNd]_`kc)Z.°dONLNddu’Å_(~’typedef Ptr speechInfo;°dONLNdÅÉ’èı*0pascal void MyErrorCallback (SpeechChannel chan,°dONLNd∏ëÁù›+) long refCon, OSErr error, long bytePos);ˇV◊#ˇ ˇˇˇˇ#◊
  687. ˇ·ˇ‚ˆA
  688. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  689. (ø36    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  690. Courier
  691. .°dONLNd;]Gu(D]phcb.°dONLNd;πG6)\Enables phoneme callbacks. <¿°dONLNd ;7G=)~Y˝@°dONLNd!;<Gx)our callback r˘Ä°dONLNd/;xG÷)<outine is invoked for °dONLNdEGπSΔ(Pπ;each phoneme generated by the speech synthesizer just befor<Ä°dONLNdÄG«Sfi(P«e the °dONLNdÜSπ_…(\π=phoneme is actually spoken. This callback can be disabled by .°dONLNd√_πk˘* passing a null °dONLNd“_˘k#)@ProcPtr°dONLNdŸ_#kB)* in the °dONLNd·_Bk~)
  692. speechInfo°dONLNdÎ_~k∞)<
  693.  parameter¬†°dONLNdı_Øk»)1. The d@°dONLNd˚_»k‹)API °dONLNdˇkπw&(tπlabel for this selector is °dONLNdk&wå)msoPhonemeCallBack°dONLNd+kåwè)f.°dONLNd2Å∑çA(ä∑typedef Ptr speechInfo;°dONLNdOè∑õ„*2pascal void MyPhonemeCallBack (SpeechChannel chan,°dONLNdàù…©õ+# long refCon, short phonemeOpcode);°dONLNd¨µ]¡u(æ]wdcb.°dONLNd±µπ¡Ô)\ Enables worı@°dONLNdºµÔ¡$)6d callbacks. h`°dONLNd…µ%¡+)6Y(‡°dONLNd µ+¡g)our callback r% °dONLNdÿµg¡€)<outine is invoked for each °dONLNdÛ¡πÕ ( πworÄ°dONLNdˆ¡ÀÕû)0d generated by the speech synthesizer just befor‹‡°dONLNd&¡ûÕ«)”    e the wor`°dONLNd/¡»Õ⁄)*d is .°dONLNd4ÕπŸΔ(÷π<actually spoken. This callback can be disabled by passing a °dONLNdpÕΔŸÿ(÷Δnil°dONLNdsÕÿŸ⁄) °dONLNdtŸπ„(‚πProcPtr°dONLNd{Ÿ„Â)* in the °dONLNdÉŸÂ>)
  694. speechInfo°dONLNdçŸ>Âp)<
  695.  parameter¬†°dONLNdóŸoÂà)1. The d@°dONLNdùŸàÂ⁄)API label for this °dONLNd∞ÂπÒË(Óπ selector is °dONLNdºÂËÒ<)/soWordCallBack°dONLNd Â<Ò?)T.°dONLNd—˚∑A(∑typedef Ptr speechInfo;°dONLNdÓ    ∑◊*0pascal void MyWordCallback (SpeechChannel chan, °dONLNd%…#≈+*long refCon, long wordPos, short wordLen);°dONLNdP/];u(8]xtnd.°dONLNdU/π;„)\DThis call supports a general method for extending the functionality °dONLNdô;πG* of the Speech Managerí °dONLNdÆ;Gò)d. It is used to set synthesizer1†°dONLNdÕ;ôG∏)|-specifiÛ†°dONLNd’;∏Gæ)c .°dONLNd◊GπS(Pπinformation. The °dONLNdËGSD)O
  696. speechInfo°dONLNdÚGDSP)< arR`°dONLNdıGPSÁ) "gument should be a pointer to the ˇˇÔÍ°dONLNdSπ_œ(\πapprR`°dONLNdSœ_)opriate data str4°dONLNd+S_-)Hucturî°dONLNd0S,_x)e. If a particular ˇˇœæ∞<°dONLNdCSy_¡)M synthCreatorˇˇÔÍ∞<°dONLNdOS¡_Ë)H
  697.  value is .°dONLNdY_πkÕ(hπnot rN@°dONLNd^_ŒkM)ecognized by the synthesizer? °dONLNdz_Mk≤), the command is ignor¿ °dONLNdê_≤k‡)e
  698. ed and an .°dONLNdökπw(tπsiUnknownInfoType°dONLNd´kwE)f
  699.  code is rR`°dONLNdµkEwÄ)&eturned. The Ù°dONLNd¬kw—):API label for this °dONLNd’wπÉË(Äπ selector is °dONLNd·wËÉH)/soSynthExtension°dONLNdÒwHÉK)`.°dONLNd¯ç∑ôâ(ñ∑#typedef SpeechXtndData *speechInfo;°dONLNd!õ∑ßq*typedef struct SpeechXtndData {°dONLNdG©…µÌ+OSType°dONLNdP©ˇµM)6synthCreator;°dONLNd_©MµS)N °dONLNda©SµÀ)// synth creator ID °dONLNd|∑…√·(¿…Byte°dONLNdÉ∑ˇ√S)6synthData[2]; °dONLNdí∑S√—)T// data TBD by synth °dONLNd≠≈∑—(Œ∑} SpeechXtndData;.°dONLNdøÏı5(ÛRESULëÄ°dONLNdƒÏ5ıY)T CODES
  700. OVÈ4PVÈ Q]QÈ
  701. ˇ·ˇ‚ˆA °dONLNdÀB]P±+(YApplication-DefiÇ@°dONLNd€B±PS)Tned Pronunciation Dictionariesˇˇˇˇˇˇ‘@(L‚1
  702. °dONLNd˚V]br(_]>No matter how sophisticated a speech synthesis system is, therÄ°dONLNd9VsbÕ(_se will always be worœÄ°dONLNdMVÕbŸ)Zds °dONLNdPc]oÍ(l]!that it does not automatically pr˜°dONLNdqcÍo$)ç onounce corr„ °dONLNd}c$o8):ectlyª °dONLNdÇc8oe) . The clearfi °dONLNdçceo∑)-est instance of worF`°dONLNd†c∏o·)S
  703. ds that ar∫@°dONLNd™c·oË))e °dONLNd¨p]|ê(y] often misprg@°dONLNd∑pê|)3onounced is the class of pr7†°dONLNd“p|Ê)u1oper names (names of people, place names, and so °dONLNd}]âp(Ü]on). .°dONLNdÀ˙]{(]noErr.°dONLNd—˙Ù˘)ó0°dONLNd”˙))No errE†°dONLNdŸ˙*3)or.°dONLNd›]ç(]paramErr.°dONLNdÊ͢)ç–50°dONLNdÍÄ)#Parameter value is invalid.°dONLNd]√(]siUnknownInfoType.°dONLNd¢)à–231°dONLNd))(FeaturÁ@°dONLNd#)»)#e is not implemented on synthesizer.°dONLNdH]'√($]incompatibleVoice.°dONLNdZÂ'˘)à–245°dONLNd_'*)(Specifi‡°dONLNdf*'fl)(ed voice cannot be used with synthesizer.°dONLNdê&]2…(/]invalidComponentID.°dONLNd£&‡2˘)É–3000.°dONLNd©&22)-Invalid °dONLNd±&22Ä)%SpeechChannel°dONLNdæ&Ä2≤)N
  704.  parameterˇ◊#ˇ ˇˇˇˇ#◊
  705. ˇ·ˇ‚ˆA
  706. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  707. (ø˝37(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  708. °dONLNd;{G…(D{One way to get arı°dONLNd;…Gå)N-ound this fundamental limitation is to use a •‡°dONLNd>;çG»)ƒdictionary of °dONLNdLH{TÑ(Q{prG °dONLNdNHÖT¡)
  709. Eonunciations. Whenever a speech synthesizer needs to determine the prÀ‡°dONLNdìH¡T(Q¡oper phonemic °dONLNd°U{a~(^{rE°dONLNd¢Uaç)epr’¿°dONLNd•Uça)esentation for a particular worÍ¿°dONLNdƒUa,)Üd, it fiæ°dONLNdÃU-aÜ)rst looks for the wor˙`°dONLNd·UÜafl)Yd in its dictionaries. °dONLNd¯b{nÑ(k{PrN†°dONLNd˙bÖn®)
  710. Bonunciation dictionary entries contain information that enables pr|Ä°dONLNd<b®nÚ(k®ecise conversion °dONLNdMo{{Î(x{between text and the corrÆ °dONLNdfoÎ{z)pect phoneme codes. They also pra°dONLNdÖo{{°)ê    ovide str‡°dONLNdéo¢{˙)'ess, intonation, and °dONLNd£|{àP(Ö{0other information to help speech synthesizers pr2‡°dONLNd”|QàÄ)÷    oduce mor솰dONLNd‹|Äà¯)/e natural speech. If the worà`°dONLNd¯|¯à)xd °dONLNd˙â{ï(í{&in question is found in the dictionary`°dONLNd âï„)£., then the synthesizer uses the information fr˝`°dONLNdNâ‚ï)ƒom the °dONLNdUñ{¢¸(ü{dictionary entry rather than r≥†°dONLNdsñ¸¢a)Åelying on its own letterOÄ°dONLNdãñb¢ì)f -to-sound r¥Ä°dONLNdññì¢⁄)1ules. The use of °dONLNdߣ{ØÌ(¨{phonemes is described in ¯`°dONLNd¿£ÌØx)r“Summary of Phonemes and Pr¥@°dONLNd€£yر)å osodic Contr5‡°dONLNdÁ£≤ØΔ)9ols,”P¿°dONLNdÏ£Δظ) later in this °dONLNd˚∞{º™(π{    document.°dONLNd¬{ŒÎ*The Speech Manager worˆ°dONLNd¬ÎŒ@)pd storage format prkÄ°dONLNd.¬AŒÕ)V!ovides high-quality data that is °dONLNdOœ{€è(ÿ{inter
  711. ¿°dONLNdTœê€˙)Ochangeable between speech synthesizers. The Speech Manager also uses an easily °dONLNd£‹{ËÂ(Â{extensible dictionary strt`°dONLNdº‹Â˸)juctur˙@°dONLNd¡‹¸ËG)e that does not afa`°dONLNd”‹HË˙)L,fect the usability of existing dictionaries.°dONLNdÓ{˙(˜{"It is assumed that application-defi”¿°dONLNd#Ó˙.)ñned pr—†°dONLNd)Ó.˙≥)onunciation dictionaries will rÿ°dONLNdHÓ≥˙Ò)Öeside in RAM °dONLNdU˚{Ã({when in use. The r%@°dONLNdg˚Õ˝)R un-time str¯°dONLNdr˚˝)0uctur}‡°dONLNdw˚w)e of dictionary data prù‡°dONLNdé˚wÍ)besumably depends on the °dONLNd¶{ó({specifiÓ °dONLNd≠óÖ)7c needs of particular speech synthesizers and will ther§ °dONLNd‰Üó)Ôefor¸ °dONLNdËó™)e difp °dONLNdÌ´¿)fer fr °dONLNdÛ¡‚)om the °dONLNd˙{!Ü({strfi°dONLNd˝Ü!ù) ucturc‡°dONLNdû!)e of the dictionaries as stor¿°dONLNd!D)v ed on disk.
  712. ?9F4@9F A{A
  713. ˇ·ˇ‚ˆA °dONLNd+2{@    (<{Associating a Dictionary W-°dONLNdE2
  714. @|)èith a Speech Channelˇˇˇˇˇˇ‘@)ˆ1
  715. °dONLNd[F{Rø(O{The following r∞@°dONLNdjFøR†)D3outines can be used to associate an application-defiF@°dONLNdûF°Ræ)‚ned prD °dONLNd§FæRı) onunciation °dONLNd∞S{_<(\{,dictionary with a particular speech channel.
  716. è9ò4ê9ó ë9ë
  717. ˇ·ˇ‚ˆA °dONLNd›Ç9êà(å9UseDictionaryˇˇˇˇˇˇ(å1
  718. .°dONLNdÏ°{≠è(™{The ,
  719. Courier°dONLNd°è≠›)UseDictionary°dONLNd˝°›≠„)N rR`°dONLNdˇ°„≠fi)7outine associates a designated dictionary with a specifiR`°dONLNd7°fi≠)˚    c speech .°dONLNd@Æ{∫†(∑{channel..°dONLNdI«{”…*pascal OSErr °dONLNdV«…”ø)N)UseDictionary (SpeechChannel chan, Handle°dONLNdÇ’ü·Ì(fiü dictionary);
  720. Ô9˛4Ô9˝    .°dONLNdêÓ{˘«(ˆ{Field descriptions
  721. ˇ·ˇ‚ˆA
  722. .°dONLNd£˚{ì*chan.°dONLNd®˚◊Ù)\Specifi‡°dONLNdØ˚Ù>)c speech channel.°dONLNd¿
  723. {∑({
  724. dictionary.°dONLNdÀ
  725. ◊2)\Handle to the specifiÛ‡°dONLNd‡
  726. 2l)[ed dictionary°dONLNdÓ099r(79 DESCRIPTION
  727. °dONLNd˙={I›+BQThe speech synthesizer will attempt to use the dictionary data pointed to by the .°dONLNdKJ{V∑*
  728. dictionary°dONLNdUJ∑VÊ)<
  729.  handle arR`°dONLNd_JÊV|)/!gument to augment the built-in pr$¿°dONLNdÄJ|V∂)ñonunciation r¿°dONLNdçJ∂VË): ules on the .°dONLNdôW{có(`{specifiÓ °dONLNd†Wóc˚)Ped speech channel. The synthesizer will use whatever elements of the dictionary °dONLNdd{p~(m{rE°dONLNdÒdpó)esourç@°dONLNdˆdópn)2ce it considers useful to the speech conversion pr*¿°dONLNd(dopã)ÿocess. ı¿°dONLNd/däpß)After rTÄ°dONLNd6d®p◊) eturning fr`°dONLNdAdÿpË)0om .°dONLNdDq{}…(z{UseDictionaryd@°dONLNdQq»})M, the caller is fr6†°dONLNdcq}))Fee to r    °dONLNdjq)}ˇ)elease any storage allocated for the dictionary .°dONLNdö~{ä√(á{handle. The sear˜‡°dONLNd™~√äŸ)Hch orÙ°dONLNdØ~Ÿä8)der for application-prY‡°dONLNd≈~9ä¿)`!ovided dictionaries is last in, fiz`°dONLNdÁ~¿äfl)árst sear8°dONLNdÔ~‡ä˜) ched.ˇ
  730. ◊#ˇ ˇˇˇˇ#◊
  731. ˇ·ˇ‚ˆA
  732. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  733. (ø38    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  734. °dONLNd;]G˙(D]$All details of how an application-prÿ°dONLNd$;˙GY)ùovided dictionary is rØ`°dONLNd:;YGg)_epr@ °dONLNd=;hG‹)esented within the speech °dONLNdWH]Tö(Q]synthesizer ar!Ä°dONLNdeHõT)>e dependent on the specifi˘ °dONLNdHTØ)s#c synthesizer implementation and ar Ä°dONLNd¢H∞T÷)¢
  735. e totally °dONLNd¨U]aÕ(^]private to the synthesizer√¿°dONLNdΔUÃaŒ)o.°dONLNd»{Ñ5(ÇRESULëÄ°dONLNdÕ{5ÑY)T CODES
  736. ”⁄È4‘⁄È ’]’È
  737. ˇ·ˇ‚ˆA °dONLNdõΔ]‘%+(N$Pronunciation Dictionary Data Formatˇˇˇˇˇˇ‘@(–‚1
  738. °dONLNd¡⁄]Ê∫(„]Each application-defiZ@°dONLNd÷⁄ªÊÿ)^ned prX °dONLNd‹⁄ÿÊ) onunciation ¡¿°dONLNdË⁄Êπ)7'dictionary is implemented as a single rê°dONLNd⁄∫Ê“)´esourÿ@°dONLNd⁄“Ê›)ce .°dONLNdÁ]Û(]of type ,
  739. Courier°dONLNdÁÛ£)"'dict'°dONLNd%Á£ÛÆ)$. Tï°dONLNd(Á≠Û∏)
  740. o rg`°dONLNd+Á∏Ûr) )ead the dictionary contents, the system fig`°dONLNdUÁrÛÑ)∫rst r9¿°dONLNdZÁÑÛ±)
  741. eads the r  °dONLNddÁ±Û»)-esourfiÄ°dONLNdiÁ«ÛÊ)ce into .°dONLNdqÙ]ø(˝]memory using Resourl °dONLNdÑÙø¯)b ce Manager r˝°dONLNdêÙ¯)9outines.°dONLNdô]m(]=An application dictionary contains the following information:°dONLNdÚ¿]ÃÇ*∫The currÍ¿°dONLNd˙¿Çô)%    ently defi±¿°dONLNd¿¨Ãı)*ned atom type is°dONLNd+Í]ˆ¸(Û]%Each entry consists of the following:°dONLNd√D]PÇ*ZThe currÍ¿°dONLNdÀDÇP´)%    ently defi±¿°dONLNd’D¨P¸)*ned entry types arʇ°dONLNdÁD¸P@)Pe the following:.°dONLNd‘â]ï{(í]noErr.…&°dONLNd⁄â˚ï)û0…&°dONLNd‹âï0)No erréΔ°dONLNd‚â1ï:)or.°dONLNdÊî]†ô(ù]
  742. memFullErr.…&°dONLNdÒîφ)è–108…&°dONLNdˆî†”)('Not enough memory to use new dictionary.°dONLNdü]´´(®]badDictFormat.…&°dONLNd-üÏ´)è–246…&°dONLNd2ü´@)(    Format prÊ°dONLNd;üA´)-oblem with prªF°dONLNdHü´„)>onunciation dictionary.°dONLNd`™]∂…(≥]invalidComponentID.…&°dONLNds™Á∂)ä–3000.…&°dONLNdy™∂9)-Invalid …&°dONLNdÅ™9∂á)%SpeechChannel…&°dONLNdé™á∂π)N
  743.  parameter.°dONLNd÷]$•(!]total byte length°dONLNdË”$Ì)v(long)°dONLNdÔ $s)9(Length is all-inclusive)°dONLNd
  744. (]4â(1]    atom type°dONLNd(”4Ì)v(long)°dONLNd8]Dû(A]format version°dONLNd,8”DÌ)v(long)°dONLNd5H]Tç(Q] script code°dONLNdAH”T)v(short)°dONLNdKX]dú(a]language code°dONLNdYX”d)v(short)°dONLNdch]t`(q]rE°dONLNddhatê)
  745. egion code°dONLNdoh”t)r(short)°dONLNdyx]Ñ°(Å]date last modifii‡°dONLNdâx¢Ѩ)Eed°dONLNdåx”ÑÌ)1(long)°dONLNdìx Ñï)9(Seconds since January 1, 1904)°dONLNd¥à]î`(ë]rE°dONLNdµàaîé)
  746. eserved(4)°dONLNd¿à”îÌ)r(long)°dONLNd…ò]§è(°] entry count°dONLNd’ò”§Ì)v(long)°dONLNdfi®]¥ï(±]list of entries.°dONLNd“]fi{**'dict°dONLNd“{fiÄ) ',    Symbol.°dONLNd““›€)WÆ°dONLNd“    fi8)7
  747. Dictionary°dONLNdP¸]®(]entry byte length°dONLNdb¸–Ì)s(short)°dONLNdj¸n)7(Length is all-inclusive)°dONLNdÖ ]ä(]
  748. entry type°dONLNdê –Ì)s(short)°dONLNdö](c(%]fiå¿°dONLNdúc(å)    eld count°dONLNd¶–(Ì)m(short)°dONLNd∞,]8~(5]    list of fi¶@°dONLNd∫,~8ê)!elds°dONLNd˜V]bq(_]0x00’X°dONLNd¸V“a€)uÆ’N°dONLNd˛Vb3)3
  749. Null entry°dONLNd
  750. f]rì(o] 0x01 to 0x20’X°dONLNdf“q€)uÆ’N°dONLNdfr-)3Reserved°dONLNd#v]Çq(]0x21’X°dONLNd(v“Å€)uÆ’N°dONLNd*vÇ)3Pr£Ó°dONLNd,vÇ])
  751. onunciation entry°dONLNd?Ü]íq(è]0x22’X°dONLNdDÜ“ë€)uÆ’N°dONLNdFÜí)3AbbrpŒ°dONLNdJÜíY)eviation entryˇ◊#ˇ ˇˇˇˇ#◊
  752. ˇ·ˇ‚ˆA
  753. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  754. (ø˝39(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  755. °dONLNd;{Gò(D{Each fij °dONLNd;ôG)eld consists of the following:°dONLNdµÖ{ë†(é{The currÍ¿°dONLNdΩÖ†ë…)%    ently defi±¿°dONLNd«Ö ë„)*ned fiı@°dONLNdÕÖ„ë) eld types arb@°dONLNdŸÖë[)4e the following:
  756. 949 {
  757. ˇ·ˇ‚ˆA °dONLNd˜ {)({!Creating and Editing Dictionariesˇˇˇˇˇˇ‘@(1
  758. °dONLNd{+è(({Ther¿°dONLNdê+)e is no built-in support for cr @°dONLNd=+∫)~(eating and editing speech dictionaries. @°dONLNdeª+¡)≠Y”¿°dONLNdf¿+Ë)    ou can cr«@°dONLNdoË+¸)(eate °dONLNdt,{8Æ(5{ dictionary r,¿°dONLNdÄ,Ø8«)4esouru°dONLNdÖ,«8N) ces using any of the available rı¿°dONLNd•,N8f)áesour>°dONLNd™,g8˚)!ce editing tools such as the MPW °dONLNdÀ9{Eù(B{DRez tool or ResEdit. Of course, you can also fairly easily develop r†°dONLNd9ûE(Bûoutines to edit the °dONLNd#F{R∂(O{dictionary str≈¿°dONLNd1F∂RÕ);ucturK†°dONLNd6FŒR‹)e frÆ °dONLNd:F‹RS)om within the application. ∫`°dONLNdUFSRz)w    At the prhÄ°dONLNd^F{RÒ)(esent time, no assumption °dONLNdxS{_T(\{2should be made that the entries in a dictionary arr¿°dONLNd™ST_l)Ÿe storv@°dONLNd∞Sl_¨)ed in sorted orú¿°dONLNdøS¨_∫)@der∑`°dONLNd¬S∫_º).
  759. }9Ñ4~9Ñ {
  760. ˇ·ˇ‚ˆA °dONLNdƒp{~ª(z{
  761. Advanced VâÄ°dONLNdŒpª~C)@oice Information Routinesˇˇˇˇˇˇ‘@(z1
  762. ˇˇÛä.°dONLNdÈÑ{êá(ç{OrR`°dONLNdÎÑáêÆ) dinarily6†°dONLNdÛÑ≠êq)&-, an application should need to use only the ,
  763. Courierˇˇ⁄ûΔz°dONLNd Ñqê„)ƒGetVoiceDescriptionˇˇÛäΔz°dONLNd3Ñ„êË)r råd°dONLNd5ÑÈê)outine .°dONLNd<ë{ùÅ(ö{<to access information about a particular voice. Occasionallyz†°dONLNdxëÄù´(öÄ    , howeverá@°dONLNdÅë´ù€)+ , it may be .°dONLNdçû{™„(ß{necessary to obtain morR`°dONLNd§û„™Ñ)h$e detailed information by using the R`°dONLNd»ûÑ™Ã)° GetVoiceInfoR`°dONLNd‘ûÙ“)H r$¿°dONLNd÷û“™Ò)outine.
  764. ⁄9„4€9‚ ‹9‹
  765. ˇ·ˇ‚ˆA .°dONLNdfiÕ9€V(◊9GetV}Ä°dONLNd‚ÕU€Ç)oiceInfoˇˇˇˇˇˇ(◊1
  766. .°dONLNdÏÏ{¯è(ı{The °dONLNdÏè¯◊) GetVoiceInfo°dONLNd¸Ï◊¯›)H rR`°dONLNd˛Ï›¯ˇ)outine r$¿°dONLNdÏˇ¯ï)"!eturns information about a specifi$¿°dONLNd(Ïï¯)ñed voice channel beyond °dONLNd@˘{‘({that obtainable thrR`°dONLNdS˘‘˛)Y    ough the R`°dONLNd\˘˛p)*GetVoiceDescriptionR`°dONLNdo˘pv)r r$¿°dONLNdq˘vï)outine.°dONLNdy{…({pascal OSErr °dONLNdÜ…È)N0GetVoiceInfo (VoiceSpec *voice, OSType selector,°dONLNd∏ ç,˘()ç void *voiceInfo);°dONLNdÃ8çDe*$typedef VoiceDescription *voiceInfo;°dONLNdÚFçRS*!typedef VoiceFileInfo *voiceInfo;°dONLNdbçnA*typedef struct VoiceFileInfo {°dONLNd6pç|±*FSSpec°dONLNd?p√|˘)6    fileSpec;°dONLNdLp |Ô)H&// vol, dir, name info for voice file °dONLNdt~çä´(áçshort°dONLNd|~√äÁ)6resID;°dONLNdÜ~ ä„)H$// resource ID of voice in the file °dONLNd´å{ò€(ï{} VoiceFileInfo;.°dONLNd%M{YÅ(V{fiå¿°dONLNd'MÅY√)eld byte length*¨°dONLNd7MÍY)i(short)ˇ˘°dONLNd?M YŒ)6'(Length is all-inclusive minus padding)°dONLNdh]{iÅ(f{fiå¿°dONLNdj]Åi§)eld type*¨°dONLNds]Íi)i(short)°dONLNd}m{yÅ(v{fiå¿°dONLNdmÅy§)eld data*¨°dONLNdàmÍy
  767. )i(char[])ˇ˘°dONLNdëm yÜ)6(Data is padded to wor·9°dONLNdßmÜyΩ)f d boundary)°dONLNdÈó{£è(†{0x00,    SymbolÄ°dONLNdÓóË¢Ò)mÆUM°dONLNdó£;)7Null fiÕ°dONLNd˜ó<£I)eld°dONLNd¸ß{≥±(∞{ 0x01 to 0x20Ä°dONLNd    ßË≤Ò)mÆUM°dONLNd ß≥G)7Reserved°dONLNd∑{√è(¿{0x21Ä°dONLNd∑ˬÒ)mÆUM°dONLNd∑√))7WjM°dONLNd∑(√1)    or§Õ°dONLNd∑1√=)    d rç°dONLNd"∑>√L)eprñM°dONLNd%∑L√º)esented in textual format.°dONLNdA«{”è(–{0x22Ä°dONLNdF«Ë“Ò)mÆUM°dONLNdH«”W)7 Phonemic pr¥ç°dONLNdS«W”¸)8%onunciation including a complete set UM°dONLNdx“fi{(€of syllable, lexical strU-°dONLNdê“{fiü)\ess, wor*M°dONLNdò“üfi±)$d prç-°dONLNdú“±fiÙ)ominence, and UM°dONLNd™›È((Êprm°dONLNd¨›)Èr)
  768. osodic markers rÃÕ°dONLNdº›rÈÄ)Iepr]ç°dONLNdø›ÅÈÔ)esented in textual format°dONLNd⁄Ì{˘è(ˆ{0x23Ä°dONLNdflÌ˯Ò)mÆUM°dONLNd·Ì˘v)7Part-of-speech codeˇ◊#ˇ ˇˇˇˇ#◊
  769. ˇ·ˇ‚ˆA
  770. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  771. (ø40    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  772. Courier
  773. .°dONLNd;]GÅ(D]enum {°dONLNdIoU€+soVoiceDescription°dONLNd!IÌU#)~    = 'info',°dONLNd.I5UÀ)H// gets basic voice info °dONLNdIWoc±(`o soVoiceFile°dONLNd[WÌc)~= 'fref'°dONLNdgW5c›)H// gets voice file ref info °dONLNdÑe]qi(n]};
  774. ~çÈ4çÈ    .°dONLNdá~]â©*Field descriptions
  775. ˇ·ˇ‚ˆA
  776. .°dONLNdöã]óÅ**voice.°dONLNd°ãπó÷)\Specifi‡°dONLNd®ã÷ó )c speech channel.°dONLNdπö]¶ç(£]selector.°dONLNd¬öπ¶4)\Used to specify data being r£ °dONLNdfiö4¶[){equested.°dONLNdÁ©]µô(≤]
  777. *voiceInfo.°dONLNdÚ©πµ6)\Pointer to an information strZ °dONLNd©7µN)~uctur‡°dONLNd©NµR)e°dONLNdŒ◊T(’ DESCRIPTION
  778. °dONLNd"‹]Ë‹+BXThis function accepts selectors that determine the type of information you want to get. °dONLNdzÈ]ıÁ*The format of the information rµ@°dONLNdôÈÁı‹)ä7eturned depends on which value is used in the selector °dONLNd–ˆ]c(ˇ]fiå¿°dONLNd“ˆc§)eld, as follows:
  779. È4È    °dONLNd„]©(]Field descriptions
  780. ˇ·ˇ‚ˆA
  781. .°dONLNdˆ]'u*info.°dONLNd˚π'[)\%Gets basic information for the specifi @°dONLNd!['£)¢ed voice. The str`°dONLNd2§'ª)Iucturç@°dONLNd7ª'¬)e ˇˇE¥.°dONLNd9'π3Ω(0πrR`°dONLNd:'Ω3p)*eturned is functionally equivalent to the ˇ˝—Ùò°dONLNdd'p3–)≥VoiceDescriptionˇˇE¥Ùò°dONLNdt'–3Ë)` data °dONLNdz3π?≈(<πstrl°dONLNd}3≈?€) uctur>`°dONLNdÇ3€?Ì)e in >`°dONLNdá3Ì?_)GetVoiceDescription>`°dONLNdö3_?”)r, described earlier in this .°dONLNd∂?πK(Hπ document. To¿°dONLNd¡?Kê)7#o maximize compatibility with futur¿°dONLNd‰?ëK€)°e versions of the .°dONLNdˆKπW(TπSpeech Manager¬†°dONLNdKWä)J, the application must set the ¬†°dONLNd#KäWÆ)álength¬†°dONLNd)KÆW∑)$ fi¬†°dONLNd,K∑WÂ)     eld of the °dONLNd7Wπc(`πVoiceDescription°dONLNdGWc')` strl°dONLNdKW'c=)uctur>`°dONLNdPW=cº)e to the size of the existing r¿°dONLNdoWºcŒ)ecor„ °dONLNdsWÕc’)d °dONLNducπo–(lπbeforR`°dONLNdzc–o˘)
  782. e calling R`°dONLNdÑc˘oA)) GetVoiceInfoR`°dONLNdêcAoÅ)H, which then r$¿°dONLNdûcÅo·)@eturns the size of the .°dONLNdµoπ{“(xπnew r∑°dONLNd∫o“{‰)ecor+`°dONLNdæoÂ{Ì)d..°dONLNd¡~]äu(á]fref.°dONLNdΔ~πä’)\Gets fiˆ‡°dONLNdÕ~’ä„)le ṙ°dONLNd—~„äÛ)eferö°dONLNd’~Ùäm)ence information for specifi‘`°dONLNdÒ~mä◊)yed voice; normally only °dONLNd    äπñï(ìπ2used by speech synthesizers to access voice disk fid¿°dONLNd<äññ±)›les dirú‡°dONLNdCä±ñ≈)ectlyt‡°dONLNdHä≈ñ«).°dONLNdJØ∏5(∂RESULëÄ°dONLNdOØ5∏Y)T CODES
  783. 
  784. È4
  785. È ]È
  786. ˇ·ˇ‚ˆAˇˇ‹.ˇ◊°dONLNd”Ù]+(IEmbedded Speech Commandsˇˇˇˇˇˇ€r(ˇ·1
  787. °dONLNdÌ
  788. ]V(]6This section describes how you can insert commands dir›Ä°dONLNd#
  789. V )˘ectly into the input text to °dONLNd@]#s( ]contr>Ä°dONLNdEt#*)'ol or modify the spoken output. When pr/`°dONLNdl*#∏)∂!ocessing input text data, speech °dONLNdç$]0b(-]=synthesizers look for special sequences of characters called 
  790. `°dONLNd $c0î(-c delimiters.- °dONLNd’$î0›)1 These character °dONLNdÊ1]=ï(:] sequences ar}¿°dONLNdÚ1ï=–)8e usually defi‰†°dONLNd1–=·);>ned to be unusual pairings of printable characters that would °dONLNd>>]J÷(G]Snot normally appear in the text. When a begin command delimiter string is encounterB@°dONLNdë>◊J‰(G◊ed °dONLNdîK]W(T](in the text, the following characters ar@ °dONLNdºKWî)ße assumed to contain one or mor6Ä°dONLNd€KîW‰)êe commands. The °dONLNdÎX]d(a](synthesizer will attempt to parse and prª°dONLNdXd⁄)∞*ocess these commands until an end command °dONLNd=e]q⁄(n]delimiter string is encounter{†°dONLNdZe⁄qÁ)}ed..°dONLNdVΩ]…{(Δ]noErr.°dONLNd\Ω‘…Ÿ)w0°dONLNd^ΩÌ…    )No errE†°dONLNddΩ
  791. …)or.°dONLNdh»]‘ô(—]
  792. memFullErr.°dONLNds»≈‘Ÿ)h–108°dONLNdx»Ì‘¿)(+Not enough memory to load voice into memory.°dONLNd•”]fl´(‹]voiceNotFound.°dONLNd≥”≈flŸ)h–244°dONLNd∏”ÌflÙ)(Vú`°dONLNdπ”Ûfl )oice ry °dONLNdø” fl#)esour¡`°dONLNdƒ”#flZ) ce not foundˇ9:◊#ˇ ˇˇˇˇ#◊
  793. ˇ·ˇ‚ˆA
  794. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  795. (ø˝41(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  796. I9O4I9O J{J
  797. ˇ·ˇ‚ˆA °dONLNd;{IC(E{Embedded Speech Command Syntaxˇˇˇˇˇˇ‘@(E1
  798. °dONLNd O{[ï(X{;By default, the begin command and end command delimiters ar@°dONLNd[Oñ[Æ(Xñe defiV°dONLNdaOÆ[)ned to be [[ and ]]. °dONLNdv\{hx(e{4The syntax of embedded command blocks is given belowØ`°dONLNd™\whì)¸, accor `°dONLNd±\ìh“)ding to these r)Ä°dONLNd¿\”hÈ)@ules: ,Zapf Dingbats°dONLNd«r{yÄ(x{n
  799. .°dONLNd…oá{) "Items enclosed in angle brackets (,
  800. Courier°dONLNdÎo{")ï<°dONLNdÏo"{7) and °dONLNdÒo7{=)>°dONLNdÚo={G)) rR`°dONLNdıoG{V)
  801. epr$¿°dONLNd¯oV{ )esent logical units that ar˜ °dONLNdo…{Ô)s    e either .°dONLNd{ááó(Ñádefir °dONLNd {òáˇ)ned further below or ary¿°dONLNd7{ˇá»)g.e atomic units that should be self-explanatory`°dONLNde{»áÕ)…. °dONLNdhê{óÄ(ñ{n
  802. °dONLNdjçáô) Items enclosed in brackets ar»`°dONLNdáçô7) e optional. °dONLNdî¢{©Ä(®{n
  803. .°dONLNdñüá´) Items followed by an ellipsis (°dONLNdµü´)â…°dONLNd∂ü´B)
  804. ) may be rR`°dONLNd¿üB´ñ),epeated one or mor$¿°dONLNd“üñ´ª)T    e times. .°dONLNd‹¥{ªÄ(∫{n
  805. .°dONLNdfi±áΩ4) 'For items separated by a vertical bar (°dONLNd±4Ω:)≠|°dONLNd±:Ω˜),), any one of the listed items may be used. .°dONLNd3Δ{ÕÄ(Ã{n
  806. °dONLNd5√áœö) =Multiple space characters between tokens may be used if desirÙ‡°dONLNdr√öœ©(Ãöed. °dONLNdwÿ{flÄ(fi{n
  807. °dONLNdy’á·) 4Multiple commands should be separated by semicolons.°dONLNdÆÊ{ÚÒ(Ô{All other characters that arX¿°dONLNd ÊÒÚÿ)v3e not enclosed between angle brackets must be enters@°dONLNd˝ÊÿÚÂ)Áed °dONLNdÛ{ˇù(¸{    literallyìÄ°dONLNd    Ûúˇµ)!. Ther@°dONLNdÛ∂ˇ˜)Ie is no limit to the number of commands that can be included in a single °dONLNdX{ ƒ(    {command block.°dONLNdø{å*Her`°dONLNd¬å8)$e is the embedded command syntax strÄ°dONLNdÊ9P)≠ucturü`°dONLNdÎPW)e:    °dONLNdˇˇ(,{Identifi˝‡°dONLNdˇˇ)e˛∞°dONLNdˇˇ)r°dONLNdˇˇ)FSyntax
  808. °dONLNd{3{?∫(<{ CommandBlock.°dONLNdà3„?Í)h<.°dONLNdâ3Í?()BeginDelimiter.∏¿°dONLNdó3(?/)>>    ∏¿°dONLNdò4/?5) 
  809. ∏¿°dONLNdô35?<)<.∏¿°dONLNdö3<?u) CommandList.@°dONLNd•3u?|)9>    @°dONLNd¶4|?Ç) 
  810. @°dONLNdß3Ç?â)<.@°dONLNd®3â?¿) EndDelimiter.~ °dONLNd¥3¡?»)8>.°dONLNd∑C{Oπ(L{BeginDelimiter.°dONLNdΔC„OÍ)h<.°dONLNd«CÍO    )String1.ù°dONLNdŒC    O)>ù°dONLNdœCO) ù°dONLNd–CO)|ù°dONLNd—CO#) ù°dONLNd“C#O*)<.ù°dONLNd”C*OI)String2.∫°dONLNd⁄CIOP)>.°dONLNd›S{_≤(\{ EndDelimiter.°dONLNdÍS„_Í)h<.°dONLNdÎSÍ_    )String1.ù°dONLNdÚS    _)>ù°dONLNdÛS_) ù°dONLNdÙS_)|ù°dONLNdıS_#) ù°dONLNdˆS#_*)<.ù°dONLNd˜S*_I)String2.∫°dONLNd˛SI_P)>.°dONLNdc{o∂(l{ CommandList .°dONLNdc„oÍ)h<.°dONLNdcÍo)Command.)†°dONLNdco)*>    )†°dONLNddo!) 
  811. )†°dONLNdc!o/)[;    )†°dONLNdd/o5) 
  812. )†°dONLNdc5o<)<.)†°dONLNdc<oe)Command.”@°dONLNd#ceoz))>]….°dONLNd(s{ß(|{Command .°dONLNd1s„Í)h<.°dONLNd2sÍ3)CommandSelector.‡°dONLNdAs4;)J>‡°dONLNdBs;A) ‡°dONLNdCsAH)[‡°dONLNdDsHN)P.‡°dONLNdEsNq)arameter.ã°dONLNdMsqx)#]ã°dONLNdNsx)….°dONLNdQÉ{èƒ(å{CommandSelector.°dONLNdaÉ„èÍ)h<.°dONLNdbÉÍè˝)OST °dONLNdeÉ˝è
  813. )ype.Í¿°dONLNdhÉ
  814. è)>.°dONLNdkì{ü§(ú{    Parameterˇˇ|.°dONLNduì„üÍ)h<ˇˇ–‹.°dONLNdvìÍü˝)OST °dONLNdyì˝ü
  815. )ypeˇˇ|.Í¿°dONLNd|ì
  816. ü)>ˇˇéfiÍ¿°dONLNd}ìü) ˇˇ|yû°dONLNd~ìü)|ˇˇéfiyû°dONLNdìü#) ˇˇ||°dONLNdÄì$ü+)<ˇˇ–‹.|°dONLNdÅì+üJ)String1ˇˇ|.%|°dONLNdàìJüQ)>ˇˇéfi%|°dONLNdâìQüV) ˇˇ|¥Z°dONLNdäìVü])|ˇˇéfi¥Z°dONLNdãì]üb) ˇˇ|C8°dONLNdåìcüj)<ˇˇ–‹.C8°dONLNdçìjüâ)String2ˇˇ|.`8°dONLNdîìâüê)>ˇˇéfi`8°dONLNdïìêüï) ˇˇ|Ô°dONLNdñìïüú)|ˇˇéfiÔ°dONLNdóìúü°) ˇˇ|}Ù°dONLNdòì¢ü©)<ˇˇ–‹.}Ù°dONLNdôì©ü )StringNˇˇ|.b4°dONLNd†ìÀü“)">ˇˇéfib4°dONLNd°ì“ü◊) ˇˇ|Ò°dONLNd¢ì◊üfi)|ˇˇéfiÒ°dONLNd£ìfiü„) °dONLNd§û„™Í(ß„<.°dONLNd•ûÍ™) FixedPointVk°dONLNd∞û™-)3alue.@°dONLNd¥û.™5)>@°dONLNdµû5™;) @°dONLNd∂û;™I)|<.@°dONLNd∏ûI™f)32BitVΔ‡°dONLNdæûe™u)alue.q °dONLNd¬ûv™})>q °dONLNd√û}™É) q °dONLNdƒûÉ™ä)|q °dONLNd≈ûä™ê) q °dONLNdΔûê™ó)<.q °dONLNd«ûó™¥)16BitV"¿°dONLNdÕû¥™ƒ)alue.Õ°dONLNd—ûƒ™À)>Õ°dONLNd“ûÀ™—) Õ°dONLNd”û—™ÿ)|.Õ°dONLNd‘ûÿ™⁄) .°dONLNd’©„µÍ(≤„<.°dONLNd÷©Íµ)8BitV1†°dONLNd€©µ)alue.€‡°dONLNdfl©µ)>.°dONLNd‚π{≈ö(¬{String1.°dONLNdÍπ„≈Í)h<.°dONLNdÎπÍ≈)    QuoteChar.}Ä°dONLNdÙπ≈)->}Ä°dONLNdıπ≈$) }Ä°dONLNdˆπ$≈+)<.}Ä°dONLNd˜π+≈R)    Character. °dONLNdπS≈Z)(> °dONLNdπZ≈`)  °dONLNdπ`≈g)<. °dONLNdπg≈ì)    QuoteChar.†°dONLNd πî≈õ)->.°dONLNd…{’ö(“{String2.°dONLNd…„’Í)h<.°dONLNd…Í’)    QuoteChar.}Ä°dONLNd!…’)->}Ä°dONLNd"…’$) }Ä°dONLNd#…$’+)<.}Ä°dONLNd$…+’R)    Character. °dONLNd-…S’Z)(> °dONLNd.…Z’`)  °dONLNd/…`’g)<. °dONLNd0…g’é)    Character.∂¿°dONLNd9…é’ï)'>∂¿°dONLNd:…ï’õ) ∂¿°dONLNd;…õ’¢)<.∂¿°dONLNd<…¢’Œ)    QuoteChar.¥@°dONLNdE…œ’÷)->.°dONLNdHŸ{Âú(‚{StringN.°dONLNdPŸ„ÂÍ)h<.°dONLNdQŸÍÂ)    QuoteChar.}Ä°dONLNdZŸÂ)->}Ä°dONLNd[ŸÂ$) }Ä°dONLNd\Ÿ$Â2)[<.}Ä°dONLNd^Ÿ2ÂY)    Character. °dONLNdgŸZÂo)(>]… °dONLNdjŸoÂu)  °dONLNdkŸuÂ|)<. °dONLNdlŸ|®)    QuoteChar.†°dONLNduŸ©Â∞)->.°dONLNdxÈ{ıß(Ú{    QuoteChar    .°dONLNdÇÈ„Ù(Ò„" | '
  817. .°dONLNdâ˘{é({OST °dONLNdå˘éõ)ype.°dONLNdê˘„Í)U<°dONLNdë˘Í\) character pattern (e.g., .°dONLNd¨˘\i)rRA◊°dONLNdÆ˘iu)TE.Ä°dONLNd∞˘v{), .Ä°dONLNd≤˘{ã)vers.π`°dONLNd∂˘ãê), .π`°dONLNd∏˘ê¶)aBcD.Ä°dONLNdº˘ß´))Ä°dONLNdΩ˘´≤)>.°dONLNd¿    {¢({    Character.°dONLNd     „Í)h<°dONLNdÀ    Íá)!Any printable character (example .°dONLNdÏ    áé)ùA.∏ °dONLNdÌ    éì), .∏ °dONLNdÔ    ìó)b.Y °dONLNd    òù), .Y °dONLNdÚ    ù†)*.<¿°dONLNdÛ    °¶), .<¿°dONLNdı    ¶¨)#.L°dONLNdˆ    ¨±), .L°dONLNd¯    ±∂)x.L°dONLNd˘    ∂∫))L°dONLNd˙    ∫¡)>.°dONLNd˝{%Æ("{ FixedPointVk°dONLNdÆ%æ)3alue.°dONLNd„%Í)5<°dONLNdÍ%V)Decimal number: 0.0000 ,    Symbol°dONLNd%V$\)l£°dONLNd&\%^) .°dONLNd'^%e)N.G@°dONLNd(f%h) G@°dONLNd)h$n)£G@°dONLNd*n%†)  65535.9999G@°dONLNd5†%ß)2>.°dONLNd8){5ò(2{32BitV1†°dONLNd>)ò5®)alue.°dONLNdC)„5Í)K<.°dONLNdD)Í5˝)OST °dONLNdG)˝5
  818. )ype.Í¿°dONLNdJ)
  819. 5)>.Í¿°dONLNdK)5) .j¿°dONLNdL)5)|.j¿°dONLNdM)5) .Í¿°dONLNdN)5$)<.Í¿°dONLNdO)$5D)LongInt.∞ °dONLNdV)E5L)!>.∞ °dONLNdW)L5N) .0 °dONLNdX)O5V)|.0 °dONLNdY)V5X) .∞ °dONLNdZ)X5_)<.∞ °dONLNd[)_5ê)
  820. HexLongInt. `°dONLNde)ë5ò)2>.°dONLNdh9{Eò(B{16BitV1†°dONLNdn9òE®)alue.°dONLNds9„EÍ)K<.°dONLNdt9ÍE)Integer.a¿°dONLNd{9E)>.a¿°dONLNd|9E) .·¿°dONLNd}9E)|.·¿°dONLNd~9E) .a¿°dONLNd9E!)<.a¿°dONLNdÄ9!EN)
  821. HexInteger.Ó`°dONLNdä9NEU)->.°dONLNdçI{Uì(R{8BitV1†°dONLNdíIìU£)alue.°dONLNdóI„UÍ)P<.°dONLNdòIÍU¸)Byte.”@°dONLNdúI¸U)>.”@°dONLNdùIU) .S@°dONLNdûIU)|.S@°dONLNdüIU) .”@°dONLNd†IU)<.”@°dONLNd°IU8)HexByte.—`°dONLNd®I9U@)#>.°dONLNd´Y{eõ(b{LongInt.°dONLNd≥Y„eÍ)h<°dONLNd¥YÍe?)Decimal number: 0 °dONLNdΔY?dE)U£°dONLNd«YEeG) .°dONLNd»YGeN)N.G@°dONLNd…YOeQ) G@°dONLNd YQdW)£G@°dONLNdÀYWeã)  4294967295G@°dONLNd÷Yãeí)4>.°dONLNdŸi{u¨(r{
  822. HexLongInt.°dONLNd‰i„uÍ)h<°dONLNdÂiÍuX)Hex number: 0x00000000 °dONLNd¸iXt^)n£°dONLNd˝i^u`) .°dONLNd˛i`ug)N.G@°dONLNdˇihuj) G@°dONLNdijtp)£G@°dONLNdipu¨)  0xFFFFFFFFG@°dONLNd i¨u≥)<>.°dONLNdy{Öó(Ç{Integer.°dONLNdy„ÖÍ)h<°dONLNdyÍÖ?)Decimal number: 0 °dONLNd*y?ÑE)U£°dONLNd+yEÖG) .°dONLNd,yGÖN)N.G@°dONLNd-yOÖQ) G@°dONLNd.yQÑW)£G@°dONLNd/yWÖr) 65535G@°dONLNd5yrÖy)>.°dONLNd9âØï›+= (continued)ˇ
  823. ◊#ˇ ˇˇˇˇ#◊
  824. ˇ·ˇ‚ˆA
  825. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  826. (ø42    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  827. ëòÈ4íòÈ ì]ìÈ
  828. ˇ·ˇ‚ˆA °dONLNdÑ]í(é]Embedded Speech Command Setˇˇˇˇˇˇ‘@(é‚1
  829. °dONLNdò]§c(°]Tµ¿°dONLNdòb§Ñ)able 1-1√@°dONLNd&òѧÈ)" outlines the set of curr…¿°dONLNd?òȧ)e    ently defiê¿°dONLNdIò§´)*ned embedded speech commands.°dONLNdˇˇ(X]
  830. HexInteger,
  831. Courier.°dONLNdˇˇ)h<°dONLNdˇˇ)Hex number: 0x0000 ,    Symbol°dONLNdˇˇ)Z£°dONLNdˇˇ) .°dONLNdˇˇ)N.G@°dONLNdˇˇ) G@°dONLNdˇˇ)£G@°dONLNdˇˇ) 0xFFFFG@°dONLNdˇˇ)$>.°dONLNdˇˇ(h]Byte.°dONLNdˇˇ)h<°dONLNdˇˇ)Decimal number: 0 °dONLNdˇˇ)U£°dONLNdˇˇ) .°dONLNdˇˇ)N.G@°dONLNdˇˇ) G@°dONLNdˇˇ)£G@°dONLNdˇˇ) 255G@°dONLNdˇˇ)>.°dONLNdˇˇ(x]HexByte.°dONLNdˇˇ)h<°dONLNdˇˇ)Hex number: 0x00 °dONLNdˇˇ)P£°dONLNdˇˇ) .°dONLNdˇˇ)N.G@°dONLNdˇˇ) G@°dONLNdˇˇ)£G@°dONLNdˇˇ) 0xFFG@°dONLNdˇˇ)>
  832. «œÈ4»œÈ À]ÀÈ
  833. ˇ·ˇ‚ˆA    .°dONLNdgΩ]»Ñ(≈]    Table 1-1°dONLNdqΩõ»)>Embedded speech commandsp°dONLNdˇˇ)z °dONLNdˇˇ(›_Command°dONLNdˇˇ+oSelecto
  834. Å`°dONLNdˇˇ) r    °dONLNdˇˇ(›    Command syntax and description
  835. °dONLNdΔÁ]Ûd(]Vú`°dONLNd«ÁcÛ~)ersion.°dONLNdŒÁŒÛÊ)kvers°dONLNd”Á    Û-);vers <.°dONLNdŸÁ-Û4)$VÕ °dONLNd⁄Á3ÛK)ersion.>†°dONLNd‡ÁLÛR)>.°dONLNd‚Ú    ˛(˚    VÕ °dONLNd„Ú˛')ersion.>†°dONLNdÈÚ(˛F)::= <.>†°dONLNdÓÚF˛c)32BitV@°dONLNdÙÚb˛r)alue.öÄ°dONLNd¯Ús˛y)>.°dONLNd˙˝        ”(    ,This command informs the synthesizer of the °dONLNd&    ÿ* /format version that will be used in subsequent °dONLNdU    œ* *commands. This command is optional but is °dONLNd    *,* highly rV¿°dONLNdá,*í)#ecommended. The currµ°dONLNdõí*÷)fent version is 1.°dONLNdÆ0]<á(9]    Delimiter.°dONLNd∏0Œ<Ê)qdlim°dONLNdΩ0    <-);dlim <.°dONLNd√0-<k)$BeginDelimiter.∏¿°dONLNd—0k<})>> <.∏¿°dONLNd‘0}<¥) EndDelimiter.F†°dONLNd‡0µ<ª)8>.°dONLNd‚;    Gí(D    The delimiter command specifi‡°dONLNdˇ;ìG⁄)äes the character °dONLNdF    R‰(O    1sequences that mark the beginning and end of all °dONLNdAQ    ]‡* -subsequent commands. The new delimiters take °dONLNdn\    h* efo‡°dONLNdp\h)fect at the end of the currÏ@°dONLNdã\h‰)nent command block. If °dONLNd°g    sm(p    the delimiter strings ar `°dONLNdπgnsë)ee empty™Ä°dONLNd¿gêsØ)", an err} °dONLNd»gØsƒ)or is ˇˇ∂⁄.°dONLNdŒr    ~“({    ,generated. (Contrast this behavior with the ˇˇ$é…°dONLNd˙r“~Í)…dlimˇˇ∂⁄…°dONLNd˛rÍ~Î) °dONLNdˇ}    â:(Ü     function of °dONLNd }:âà)1SetSpeechInfo°dONLNd}àâè)N.).°dONLNdè]õâ(ò]Comment.°dONLNd$èŒõÊ)qcmnt°dONLNd)è    õ-);cmnt [.°dONLNd/è-õT)$    Character.†°dONLNd8èUõa)(]….°dONLNd;ö    ¶’(£    -This command enables a developer to insert a °dONLNdh•    ±n* comment into a text str °dONLNd•o±Ÿ)feam for documentation °dONLNdï∞    º›(π    1purposes. Note that all characters following the .°dONLNdΔª    «!* cmnt°dONLNd ª!«y) selector up to the <.°dONLNdflªy«∞)X EndDelimiter.‡°dONLNdΪ±«ƒ)8> ar‡@°dONLNdÔª√«Î)
  836. e part of .°dONLNd˘Δ    “E(œ     the comment.°dONLNdÿ]‰t(·]Reset.°dONLNdÿŒ‰Ê)qrset°dONLNdÿ    ‰-);rset <.°dONLNdÿ-‰J)$32BitV1†°dONLNdÿJ‰Z)alue.€‡°dONLNd"ÿZ‰`)>.°dONLNd$„    Ô (Ï    The rÄ¿°dONLNd)„ Ôz)eset command will rc`°dONLNd<„zÔÍ)Zeset the speech channel’s °dONLNdVÓ    ˙Á(˜    3settings back to the default values. The parameter °dONLNd⢠   X* should be set to 0.°dONLNd† Ø›+¶ (continued)    °dONLNdˇˇ(H]Identifi˝‡°dONLNdˇˇ)e˛∞°dONLNdˇˇ)r°dONLNdˇˇ)FSyntaxˇ¿◊#ˇ ˇˇˇˇ#◊
  837. ˇ·ˇ‚ˆA
  838. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Using the Speech Manager, Palatino
  839. (ø˝43(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  840. °dONLNde{q∏(n{Baseline pitch,
  841. Courier.°dONLNdeÏq)qpbas°dONLNde'q{);pbas [+ | -] <.°dONLNd"e{qê)TPitch.»¿°dONLNd'eêqñ)>.°dONLNd)p'|<(y'Pitch.»¿°dONLNd.p<|`) ::= <.»¿°dONLNd4p`|ì)$ FixedPointV≥¿°dONLNd?pì|£)3alue.^°dONLNdCp§|™)>.°dONLNdE{'áÒ(Ñ'+The baseline pitch command changes the curr‘@°dONLNdp{Òá) ent °dONLNdtÜ'íˇ(è'3pitch for the speech channel. The pitch value is a °dONLNdßë'ù-* fiå¿°dONLNd©ë-ù”)%xed-point number in the range 1.0 thr_`°dONLNdŒë”ù)¶ ough 100.0 °dONLNdŸú'®â(•'that conforms to the fr`°dONLNdú䮵)c    equency rQ†°dONLNd˘úµ®Ë)+ elationship °dONLNd≤'æo(ª'Hertz = 440.0 * 2B‡°dONLNd∞pπ≠(∑p((Pitch – 69) / 12)
  842. °dONLNd-»'‘í(—'If the pitch number is pr€ °dONLNdF»í‘‰)keceded by a + or – °dONLNdY”'flO(‹'    charactere¿°dONLNdb”OflŸ)(", the baseline pitch is adjusted rÙ`°dONLNdÑ”Ÿfl)ä elative to °dONLNdèfi'ÍF(Á'its currñ¿°dONLNdófiFÍ¥)ent value. Pitch values ar*‡°dONLNd±fiµÍ)oe always positive °dONLNd√È'ı∏(Ú'"numbers. For further details, see H°dONLNdÂÈπı)í“SetSpeechInfo,”#¿°dONLNdıÈı)K °dONLNdˆÙ'í(˝'earlier in this document.°dONLNd{«({Pitch modulation.°dONLNd"Ï)qpmod°dONLNd''{);pmod [+ | -] <.°dONLNd5{√)TModulationDepth.@`°dONLNdDƒ )I>.°dONLNdF'o('ModulationDepth.@`°dONLNdUpî)I ::= <.@`°dONLNd[î«)$ FixedPointV+`°dONLNdf«◊)3alue.’†°dONLNdj◊›)>.°dONLNdl'(Ó(%')The pitch modulation command changes the °dONLNdï''3Û* -modulation range for the speech channel. The °dONLNd¬2'>è* modulation value is a fi◊‡°dONLNd⁄2è>˝)hxed-point number in the °dONLNdÚ='I^(F'range 0.0 thrıÄ°dONLNdˇ=^IÎ)7 ough 100.0 that conforms to the °dONLNdH'Tá(Q'following pitch and fr$°dONLNd5HàT≥)a    equency rm@°dONLNd>H≥TÍ)+elationships:.°dONLNdM^'jy(g'Maximum pitch = °dONLNd]^yjØ)R    BasePitch°dONLNdf^Øjπ)6 + °dONLNdi^πjÈ)
  843. PitchMod°dONLNdri'uw(r'Minimum pitch = °dONLNdÇiwu≠)P    BasePitch°dONLNdãi≠uµ)6 - °dONLNdéiµuÂ)PitchMod°dONLNdót'Ä{(}'Maximum Hertz = °dONLNdßt{ı)T    BaseHertz°dONLNd∞t±Äø)6 * 2.°dONLNd¥rø{»(yø(+ .°dONLNd∑s…{Ò)
  844. ModValue.°dONLNdørÒ{)( / 12)
  845. .°dONLNdΔ'ãy(à'Minimum Hertz = °dONLNd÷yãØ)R    BaseHertz°dONLNdflØãΩ)6 * 2.°dONLNd„}ΩÜ≈(ÑΩ(– .*°dONLNdÊ~ΔÜÓ)    ModValue.*°dONLNdÓ}ÓÜ)( / 12)
  846. °dONLNdˆï'°.(û'A∫†°dONLNd˜ï.°w) value of 0.0 corr¿°dONLNd    ïx°)Jesponds to no modulation and °dONLNd&†'¨Â(©',will cause the speech channel to speak in a °dONLNdR´'∑Ù* ,monotone. If the modulation depth number is °dONLNd~∂'¬0* prG °dONLNdÄ∂1¬¨)
  847. eceded by a + or – characterø†°dONLNdú∂´¬Ÿ)z , the pitch °dONLNd®¡'Õì( 'modulation is adjusted rè °dONLNd¿¡ìÕ›)lelative to its curr™`°dONLNd”¡›ÕÌ)Jent °dONLNd◊Ã'ÿ©(’' value. For further details, see z°dONLNd˜Ã™ÿÙ)É“SetSpeechInfo,”U¿°dONLNdÃıÿ˜)K °dONLNd◊'„í(‡'earlier in this document.°dONLNd#È{ı∑(Ú{Speaking rate.°dONLNd1ÈÏı)qrate°dONLNd6È'ı{);rate [+ | -] <.°dONLNdDÈ{ıÑ)TWΩ†°dONLNdEÈÑı¡)    ordsPerMinute.e`°dONLNdRȬı»)>>.°dONLNdTÙ'0(˝'WΩ†°dONLNdUÙ0m)    ordsPerMinute.e`°dONLNdbÙnp)> e`°dONLNdcÙpé)::= <.e`°dONLNdhÙé¡) FixedPointVP`°dONLNdsÙ¡—)3alue.˙†°dONLNdwÙ—◊)>.°dONLNdyˇ' ('1The speaking rate command sets the speaking rate °dONLNd™
  848. 'C* in worK@°dONLNd∞
  849. D),ds per minute on the speech channel. If the °dONLNd‹'!h('rate value is prJÄ°dONLNdÏi!‰)Beceded by a + or – character√°dONLNd„!¯)z, the °dONLNd ',ö()'speaking rate is adjusted r( °dONLNd) õ,Â)telative to its currC`°dONLNd< Â,ı)Jent °dONLNd@+'7A(4'value.™°dONLNdJ=€I    +¥ (continued)
  850. F9M4F9M I{I
  851. ˇ·ˇ‚ˆA    °dONLNdˇˇ(C{    Table 1-1°dONLNdˇˇ)>Embedded speech commandsp°dONLNdˇˇ)z  (continued)°dONLNdˇˇ([}Command°dONLNdˇˇ+oSelecto
  852. Å`°dONLNdˇˇ) r    °dONLNdˇˇ(['Command syntax and descriptionˇÊ◊#ˇ ˇˇˇˇ#◊
  853. ˇ·ˇ‚ˆA
  854. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  855. (ø44    )BUsing the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  856. °dONLNde]qd(n]Vú`°dONLNdecq)olume,
  857. Courier.°dONLNdeŒqÊ)kvolm°dONLNd e    q]);volm [+ | -] <.°dONLNde]qd)TV˙¿°dONLNdecq{)olume.l@°dONLNd e|qÇ)>.°dONLNd"p    |(y    V˙¿°dONLNd#p|')olume.l@°dONLNd(p(|F)::= <.l@°dONLNd-pF|y) FixedPointVW@°dONLNd8py|â)3alue.Ä°dONLNd<pä|ê)>.°dONLNd>{    á–(Ñ    (The volume command changes the speaking °dONLNdfÜ    íö* volume on the speech channel. V‡°dONLNdÖÜöí≈)ë    olumes aròÄ°dONLNdéÜ≈íÃ)+e °dONLNdêë    ù(ö    expr9`°dONLNdîëùH)
  858. essed in fi(‡°dONLNdüëIùª),xed-point units ranging frs†°dONLNdπëªù⁄)rom 0.0 °dONLNd¿ú    ®(•    thrX¿°dONLNd√ú®C) ough 1.0 . WÄ°dONLNdŒúC®J)-Aí °dONLNdœúJ®ì) value of 0.0 corrÿ@°dONLNd·úì®Ë)Iesponds to silence, °dONLNdıß    ≥j(∞    and a value of 1.0 corr3@°dONLNd ßk≥›)besponds to the maximum °dONLNd#≤    æ](ª    possible volume. Vÿ‡°dONLNd5≤\æÍ)S#olume units lie on a scale that is °dONLNdXΩ    …ù(Δ    "linear with amplitude or voltage. ∞@°dONLNdzΩù…§)îA͇°dONLNd{Ω§…‹) doubling of °dONLNdà»    ‘(—    per¿°dONLNd㻑s)ceived loudness corrÒ¿°dONLNdü»r‘·)Zesponds to a doubling of °dONLNd∏”    fl=(‹     the volume.°dONLNd≈Â]Òr(Ó]Sync.°dONLNd ÂŒÒÊ)qsync°dONLNdœÂ    Ò-);sync <.°dONLNd’Â-Òc)$ SyncMessage. °dONLNd‡ÂdÒj)7>.°dONLNd‚    ¸?(˘     SyncMessage. °dONLNdÌ@¸^)7::= <. °dONLNdÚ^¸{)32BitV–¿°dONLNd¯z¸ä)alue.{°dONLNd¸ã¸ë)>.°dONLNd˛˚     (    *The sync command causes a callback to the °dONLNd(    ≥* %application’s sync command callback rP¿°dONLNdM¥Ë)´ outine. The °dONLNdY    ≠(    $callback is made when the audio corr†°dONLNd}≠È)§esponding to °dONLNdä    (@(%     the next worÙ‡°dONLNdñ@(Õ)7 d begins to sound. The callback °dONLNd∂'    3 (0    rE°dONLNd∑'3f)outine is passed the Ά°dONLNdÃ'f3ú)Y SyncMessageä¿°dONLNd◊'ù3¡)7     value fr°dONLNd‡'¬3„)%om the °dONLNdÁ2    >~(;    command. If the callback ró†°dONLNd2~>÷)uoutine has not been °dONLNd=    I(F    defir °dONLNd=Iê)ned, the command is ignor©‡°dONLNd2=êI“)ved. For further °dONLNdBH    T;(Q    details, see ¿°dONLNdOH<TÜ)3“SetSpeechInfo,”·Ä°dONLNd_HÜT≈)J earlier in this °dONLNdpS    _8(\        document.°dONLNd{e]që(n]
  859. Input mode.°dONLNdÜeŒqÊ)qinpt°dONLNdãe    q•);inpt TX | TEXT | PH | PHON.°dONLNd¶p    |™* "This command switches the input prC@°dONLNd»p´|“)¢    ocessing °dONLNd—{    áË(Ñ    /mode to either normal text mode or raw phoneme °dONLNdÜ    í$* mode.°dONLNdò]§£(°]Character mode.°dONLNdòŒ§Ê)qchar°dONLNdò    §i);char NORM | LTRL.°dONLNd,£    Ø«* 'The character mode command sets the wor}Ä°dONLNdS£«Øœ)æd °dONLNdUÆ    ∫Ω(∑    'speaking mode of the speech synthesizeriÄ°dONLNd|ÆΩ∫fi)¥. When ˇ˛Ä.°dONLNdÉπ    ≈!(¬    NORMˇˇÄ°dONLNdáπ!≈Ï)/ mode is selected, the synthesizer attempts to .°dONLNd∂ƒ    –}(Õ    automatically convert wor˚`°dONLNdœƒ}–‡)tds into speech. This is °dONLNdÁœ    €Õ(ÿ    .the most basic function of the text-to-speech .°dONLNd⁄    Ê>* synthesizer¬†°dONLNd ⁄=Ê`)4. When ¬†°dONLNd'⁄`Êx)#LTRLd@°dONLNd+⁄xÊ⁄) mode is selected, the .°dONLNdB    Òã(Ó    synthesizer speaks every wor~ °dONLNd^ÂãÒπ)Ç    d, numberÇ°dONLNdgÂ∏Ò–)-, and °dONLNdm    ¸j(˘    symbol letter by letter≈°dONLNdÑi¸œ)`. Embedded command °dONLNdó˚    (    prG °dONLNdô˚√)
  860. 'ocessing continues to function normallyí °dONLNd¿˚¬«)Ø, °dONLNd¬    /(    however冰dONLNd…/1)&.°dONLNdÃ]$û(!] Number mode.°dONLNdÿŒ$Ê)qnmbr°dONLNd›    $i);nmbr NORM | LTRL.°dONLNdÓ#    /’* (The number mode command sets the number °dONLNd.    :Ω* 'speaking mode of the speech synthesizeriÄ°dONLNd=.Ω:fi)¥. When ˇ˛Ä.°dONLNdD9    E!(B    NORMˇˇÄ°dONLNdH9!EÏ)/ mode is selected, the synthesizer attempts to .°dONLNdwD    P∑(M    'automatically speak numeric strings as .°dONLNdûO    [ö*  intelligently as possible. When °dONLNdæOö[≤)ëLTRL!†°dONLNd¬O≤[ÿ)     mode is .°dONLNdÀZ    fÅ(c    selected, numeric strings arN‡°dONLNdÁZÇfÁ)ye spoken digit by digit.™°dONLNdlΩxÎ+; (continued)
  861. FMÈ4FMÈ I]IÈ
  862. ˇ·ˇ‚ˆA    °dONLNdˇˇ(C]    Table 1-1°dONLNdˇˇ)>Embedded speech commandsp°dONLNdˇˇ)z  (continued)°dONLNdˇˇ([_Command°dONLNdˇˇ+oSelecto
  863. Å`°dONLNdˇˇ) r    °dONLNdˇˇ([    Command syntax and descriptionˇ4◊#ˇ ˇˇˇˇ#◊
  864. ˇ·ˇ‚ˆA
  865. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{)Summary of Phonemes and Prosodic Controls, Palatino
  866. (ø˝45(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  867. °dONLNdX{d“(a{JSynthesizers often support embedded commands that extend the set given in ”‡°dONLNdhX“dÿ(a“T    †°dONLNdiXÿd˙)able 1-1 °dONLNdqX˙dˇ)". 
  868. Ç9â4É9â Ñ{Ñ
  869. ˇ·ˇ‚ˆA °dONLNdtu{Éq({'Embedded Speech Command Error Reportingˇˇˇˇˇˇ‘@(1
  870. °dONLNdùâ{ï&(í{!While embedded speech commands arà`°dONLNdæâ&ïR)´
  871. e being pr≥@°dONLNd»âRïÕ),ocessed, several types of err∏`°dONLNdÂâÕïˇ){ ors may be °dONLNdñ{¢∫(ü{detected and rªÄ°dONLNd˛ñ∫¢§)?6eported to your application. If you have set up an err®Ä°dONLNd4ñ§¢˚)Íor callback handler ˇˇ(.°dONLNdH£{ا(¨{    with the ,
  872. Courierˇ˝ZxºP°dONLNdQ£§Ø˛))soErrorCallBackˇˇ(ºP°dONLNd`£˛Ø>)Z selector of the ˇ˝Zx4°dONLNdq£?Øç)ASetSpeechInfoˇˇ(4°dONLNd~£çØí)N r%x°dONLNdÄ£íØ)outine (described earlier), .°dONLNdú∞{ºΔ(π{you will be notifiÎÄ°dONLNdÆ∞Δº!)Ked once for every errJ °dONLNd√∞"ºÌ)\0or that is detected. If you have not enabled err±`°dONLNdÛ∞̺¯)Àor °dONLNdˆΩ{…n(Δ{9callbacks, you can still obtain information about the err‰¿°dONLNd/Ωn…™)Ûors encounter4 °dONLNd<Ω´…Ê)=ed by calling .°dONLNdJ {÷…(”{GetSpeechInfo°dONLNdW …÷ˆ)N
  873.  with the °dONLNda ˆ÷&)-soErrors°dONLNdi &÷∫)0# selector (also described earlier).°dONLNdå ∫÷˛)î The following .°dONLNdõ◊{„á(‡{err@°dONLNdû◊à„°)ors arÎ`°dONLNd§◊†„˙)e detected during pr„‡°dONLNd∏◊˙„≤)Z%ocessing of embedded speech commands:
  874. <9W4=9W
  875. g9o4h9o i9i
  876. ˇ·ˇ‚ˆAˇˇ©ˇÆ°dONLNdIT9g(b9Summary of Phonemes and Pr√$°dONLNdcTgq)‹ osodic Contr√ °dONLNdoTqgÖ)\olsˇˇˇˇˇˇV˛)é1
  877. °dONLNdtx{ÑH(Å{+This section summarizes the phonemes and prû°dONLNdüxHÑ~)Õ osodic contrx‡°dONLNd´x~Ñ≤)6 ols used by u†°dONLNd∑x≤Ñ)4American English °dONLNd»Ö{ë‘(é{speech synthesizers.°dONLNde{qô(n{Silence.°dONLNdeÏq)qslnc°dONLNde'qK);slnc <.°dONLNdeKq~)$ Milliseconds.…`°dONLNde~qÑ)3>.°dONLNd!p'|Z(y' Milliseconds.…`°dONLNd-pZ|~)3 ::= <.…`°dONLNd3p~|õ)$32BitV{°dONLNd9põ|´)alue.%@°dONLNd=p¨|≤)>.°dONLNd?{'á˘(Ñ'.The silence command causes the synthesizer to °dONLNdmÜ'í´* generate silence for the specifi\Ä°dONLNdçܨíˇ)Öed amount of time.°dONLNd°ò{§¶(°{Emphasis.°dONLNd™òϧ)qemph°dONLNdØò'§c);
  878. emph + | -.°dONLNd∫£'ØÏ* (The emphasis command causes the next wor∫°dONLNd‚£ÏØˇ)≈d to °dONLNdÁÆ'∫í(∑'be spoken with either grŸ@°dONLNdˇÆí∫ı)keater emphasis or less °dONLNdπ'≈(¬'.emphasis than would normally be used. Using + °dONLNdDƒ'–G* will forûÄ°dONLNdLƒG–˛) )ce added emphasis, while using – will for∑°dONLNduƒ˛–    )∑ce °dONLNdxœ'€*(ÿ'rE°dONLNdyœ+€z)educed emphasis.°dONLNdã·{ÌÆ(Í{ Synthesizer±†°dONLNdñ·ÆÌŒ)3-Specifiv`°dONLNdû·œÌ”)!c.°dONLNd†·ÏÌ)xtnd°dONLNd•·'ÌK);xtnd <.°dONLNd´·KÌn)$SynthCrS†°dONLNd≤·nÌÅ)#eator.O@°dONLNd∑·ÇÌî)> [.O@°dONLNd∫·î̺)    parameter.Ÿ`°dONLNd√·ºÌ¬)(].°dONLNd≈Ï'¯J(ı'SynthCrS†°dONLNdÃÏJ¯])#eator.O@°dONLNd—Ï^¯Ç) ::= <.O@°dONLNd◊Ïǯï)$OST÷`°dONLNd⁄Ï)ype.∫°dONLNd›Ï¢¯®)>.°dONLNdfl˜'π('The extension command enables °dONLNd˝'Y* synthesizerƇ°dONLNdYx)2-specifip‡°dONLNdy) c commands to be embedded in °dONLNd-'p('the input text strû °dONLNd?pÏ)Ieam. The format of the data °dONLNd['$T(!'
  879. following ØÄ°dONLNdeT$w)-SynthCrÉ °dONLNdlw$ä)#eator~¿°dONLNdqã$´)     is entir.‡°dONLNdz¨$˚)!ely dependent on °dONLNdã#'/‡(,',the synthesizer being used. If a particular °dONLNd∑.':J* SynthCrS†°dONLNdæ.J:])#eatorO@°dONLNd√.^:)     is not rB‡°dONLNdÃ.:˛)!ecognized by the synthesizer3¿°dONLNdË.˛:), °dONLNdÍ9'Eá(B'the command is ignor°dONLNd˛9àE¡)aed but no errˇ†°dONLNd 9¿E)8or is generated..°dONLNd›Á{Û∑({
  880. badParmVal.°dONLNdËÁ„Û˜)h–245°dONLNdÌÁ Û~)(Parameter value is invalid.°dONLNd    Ú{˛∑(˚{
  881. badCmdText.°dONLNdÚ„˛˜)h–246°dONLNdÚ ˛“)('Embedded command syntax or parameter pr°Ä°dONLNd@Ú“˛Ì)«oblem.°dONLNdG˝{    ±({    unimplCmd.°dONLNdQ˝„    ˜)h–247°dONLNdV˝     )(2Embedded command is not implemented on synthesizer.°dONLNdä{±({    unimplMsg.°dONLNd)h–248°dONLNdô ÷)(,Raw phoneme text contains invalid characters.°dONLNd«{∑({
  882. badVoiceID.°dONLNd“„˜)h–250°dONLNd◊ ()(Specifi‡°dONLNdfi(ì)ed voice has not been prfl@°dONLNdˆì∂)keloaded.°dONLNdˇ{*√('{ badParmCount.°dONLNd „*˜)h–252°dONLNd *%)(IncorrM@°dONLNd&*œ)!ect number of embedded command arN‡°dONLNd8œ*¯)©guments °dONLNd@) 5%(2 found
  883. F9M4F9M I{I
  884. ˇ·ˇ‚ˆA    °dONLNdˇˇ(C{    Table 1-1°dONLNdˇˇ)>Embedded speech commandsp°dONLNdˇˇ)z  (continued)°dONLNdˇˇ([}Command°dONLNdˇˇ+oSelecto
  885. Å`°dONLNdˇˇ) r    °dONLNdˇˇ(['Command syntax and descriptionˇ"T◊#ˇ ˇˇˇˇ#◊
  886. ˇ·ˇ‚ˆA
  887. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  888. (ø46    )B)Summary of Phonemes and Prosodic Controls*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  889. JRÈ4KQÈ LLÈ
  890. ˇ·ˇ‚ˆA°dONLNd;Jo(F Phoneme Setˇˇˇˇˇˇ∑†(F·1
  891. °dONLNdQ]]c(Z]Tµ¿°dONLNdQb]Ñ)able 1-2√@°dONLNdQÑ]
  892. )" summarizes the set of standar2@°dONLNd4Q ]G)á d phonemes r—†°dONLNd@QG]É)<ecognized by g†°dONLNdMQÑ]’)=American English °dONLNd^^]j∂(g]speech synthesizers.°dONLNdsp]|*.In this description, it is assumed that specifi@°dONLNd¢p|))¬c rË °dONLNd•p)|ÿ)
  893. 'ules and markers apply only to general °dONLNdÃ}]â8(Ü]0American English. Other languages and dialects rΔ`°dONLNd¸}8âO)€equir›†°dONLNd}Oâb)e difQ†°dONLNd}câo)fer4 °dONLNd    }oâ·) ent phoneme inventories. °dONLNd"ä]ñ›(ì]Phonemes divide into two gr퇰dONLNd=ä›ñc)Äoups: vowels and consonants.  ‡°dONLNdZäcñ¿)ÜAll vowel symbols arè@°dONLNdnä¡ñ»)^e °dONLNdpó]£w(†]upper°dONLNduóx£à)Acase pairs of letters. For consonants, in cases in which the corrõ‡°dONLNd∂óà£Ê(†àespondence between °dONLNd…§]∞(≠]%the consonant and its symbol is apparu@°dONLNdÓ§∞Ö)ßent, the symbol is that lowerrg@°dONLNd §Ö∞◊)Åcase consonant; in °dONLNd±]Ω˜(∫]#other cases, the symbol is an upperÌ °dONLNdB±˜ΩH)öcase consonant. W¶ °dONLNdS±HΩ©)Qithin the example wor≈@°dONLNdh±©Ω»)ads, the °dONLNdpæ] Ù(«] individual sounds being exemplifiE °dONLNdëæı Y)òed appear in bold face.
  894. ÓˆÈ4ÓıÈ Ò]ÒÈ
  895. ˇ·ˇ‚ˆA    °dONLNd©„]ÓÑ(Î]    Table 1-2°dONLNd≥„õÓ,)> American English phoneme symbols@°dONLNdˇˇ)í °dONLNdfl˚;(Symbol∞Ω°dONLNdÊ˚Z)?ExampleºÏ°dONLNdÓ˚¶«)LOpcode§ó°dONLNdı˚"B)|Symbolz°dONLNd¸˚aÜ)?Examplesœ°dONLNd˚±“)POpcode
  896. °dONLNd 
  897. ((AE∞Ω°dONLNd
  898. Z_)?b    8]°dONLNd `e)a
  899. 9-°dONLNd
  900. eh)tºÏ°dONLNd
  901. ¶´)A2§ó°dONLNd
  902. "')|b    z°dONLNd af)?b
  903. ù⁄°dONLNd
  904. fn)insϡdONLNd
  905. ±ª)K18°dONLNd('(%EY∞Ω°dONLNd"Z(_)?b    8]°dONLNd#`(g)ai
  906. πM°dONLNd%g(j)tºÏ°dONLNd'¶(´)?3§ó°dONLNd)"())|C    z°dONLNd+a(k)?ch
  907. û™°dONLNd-k(s)
  908. insœ°dONLNd0±(ª)F19°dONLNd4.:*(7AO∞Ω°dONLNd7.Z:^)?c     ˝°dONLNd8/_:i)au
  909. °-°dONLNd:.i:w)
  910. ghtºÏ°dONLNd>.¶:´)=4§ó°dONLNd@.":()|d    z°dONLNdB/a:f)?d
  911. ù⁄°dONLNdC.f:n)insœ°dONLNdF.±:ª)K20°dONLNdJ@L)(IAX    ∞Ω°dONLNdMAZL_)?a
  912. ±ç°dONLNdN@_Ls)boutºÏ°dONLNdS@¶L´)G5§ó°dONLNdU@"L))|D    z°dONLNdWAaLi)?th
  913. úä°dONLNdY@iLv)emsœ°dONLNd\@±Lª)H21°dONLNd`R^%([IY∞Ω°dONLNdcRZ^_)?b    8]°dONLNddS`^j)ee
  914. 9˝°dONLNdfRj^m)
  915. tºÏ°dONLNdhR¶^´)<6§ó°dONLNdjR"^%)|f    z°dONLNdlSa^c)?f
  916. *°dONLNdmRd^l)insœ°dONLNdpR±^ª)M22°dONLNdtdp)(mEH∞Ω°dONLNdwdZp_)?b    8]°dONLNdxe`pe)e
  917. 9-°dONLNdydeph)tºÏ°dONLNd{d¶p´)A7§ó°dONLNd}d"p')|g    z°dONLNdeapf)?g
  918. ù⁄°dONLNdÄdfps)ainsœ°dONLNdÑd±pª)K23°dONLNdàvÇ&(IH∞Ω°dONLNdãvZÇ_)?b    8]°dONLNdåw`Çb)i
  919. ∏}°dONLNdçvbÇe)tºÏ°dONLNdèv¶Ç´)D8§ó°dONLNdëv"Ç')|h    z°dONLNdìwaÇf)?h
  920. ù⁄°dONLNdîvfÇn)atsœ°dONLNdóv±Çª)K24°dONLNdõàî"(ëA+Ä°dONLNdúà"î()Y∞Ω°dONLNdûàZî_)8b    8]°dONLNdüâ`îb)i
  921. ∏}°dONLNd†àbîj)teºÏ°dONLNd£à¶î´)D9§ó°dONLNd•à"î%)|J    z°dONLNdßâaîf)?g
  922. ù⁄°dONLNd®àfîn)insœ°dONLNd´à±îª)K25°dONLNdØö¶%(£IX∞Ω°dONLNd≤öZ¶])?ruΩ°dONLNd≥ö^¶g)os    (=°dONLNdµõh¶m)
  923. e
  924. )°dONLNd∂öm¶q)sºÏ°dONLNd∏ö¶¶∞)910§ó°dONLNdªö"¶')|k    z°dONLNdΩõa¶f)?k
  925. J°dONLNdæöf¶n)insœ°dONLNd¡ö±¶ª)K26°dONLNd≈¨∏*(µAA∞Ω°dONLNd»¨Z∏^)?c     ˝°dONLNd…≠_∏d)o
  926. †]°dONLNd ¨d∏g)tºÏ°dONLNdè¶∏´)B10L°dONLNdÕ¨´∏∞)1§ó°dONLNdœ¨"∏$)wl    z°dONLNd—≠a∏c)?l
  927. ûö°dONLNd“¨c∏t)imbsœ°dONLNd÷¨±∏ª)N27°dONLNd⁄æ ,(«UW∞Ω°dONLNd›æZ _)?b    8]°dONLNdfiø` j)oo
  928. 7°dONLNd‡æk n) tºÏ°dONLNd‚涠∞);12§ó°dONLNdÂæ" *)|m    z°dONLNdÁøa i)?m
  929. ä°dONLNdËæi q)atsœ°dONLNdÎæ± ª)H28°dONLNdÔ–‹+(ŸUH∞Ω°dONLNdÚ–Z‹_)?b    8]°dONLNdÛ—`‹j)oo
  930. 7°dONLNdı–k‹p) kºÏ°dONLNd˜–¶‹∞);13§ó°dONLNd˙–"‹')|n    z°dONLNd¸—a‹f)?n
  931. ù⁄°dONLNd˝–f‹n)atsœ°dONLNd–±‹ª)K29°dONLNd‚Ó)(ÎUX∞Ω°dONLNd‚ZÓ_)?b    8]°dONLNd„`Óe)u
  932. ∑Ω°dONLNd    ‚eÓk)dºÏ°dONLNd ‚¶Ó∞)A14§ó°dONLNd‚"Ó*)|Nz°dONLNd‚aÓi)?ta    `⁄°dONLNd„iÓs)ng
  933. sœ°dONLNd‚±Óª)H30°dONLNdÙ,(˝OW∞Ω°dONLNdÙZ_)?b    8]°dONLNdı`j)oa
  934. ∏ç°dONLNdÙjm)
  935. tºÏ°dONLNd!Ù¶∞)<15§ó°dONLNd$Ù"()|p    z°dONLNd&ıaf)?p
  936. ù⁄°dONLNd'Ùfn)insœ°dONLNd*Ù±ª)K31°dONLNd."(A⇰dONLNd/",)W∞Ω°dONLNd1Z_)8b    8]°dONLNd2`j)ou
  937. 7°dONLNd4kn) tºÏ°dONLNd6¶∞);16§ó°dONLNd9"%)|r    z°dONLNd;ad)?r
  938. ûä°dONLNd<dn)ansœ°dONLNd?±ª)M32°dONLNdC$)(!OY∞Ω°dONLNdFZ$_)?b    8]°dONLNdG`$e)o
  939. ∑Ω°dONLNdHe$j)yºÏ°dONLNdJ¶$∞)A17§ó°dONLNdM"$&)|s    z°dONLNdOa$f)?s
  940. J°dONLNdPf$n)insœ°dONLNdS±$ª)K33§ó°dONLNdZ*"6'(3"S    z°dONLNd\+a6k)?sh
  941. û™°dONLNd^*k6s)
  942. insœ°dONLNda*±6ª)F34§ó°dONLNdh<"H%(E"t    z°dONLNdj=aHc)?t
  943. *°dONLNdk<dHl)insœ°dONLNdn<±Hª)M35§ó°dONLNduN"Z((W"T    z°dONLNdwOaZi)?th
  944. úä°dONLNdyNiZq)insœ°dONLNd|N±Zª)H36§ó°dONLNdÉ`"l'(i"v    z°dONLNdÖaalf)?v
  945. J°dONLNdÜ`flp)ansœ°dONLNdâ`±lª)K37§ó°dONLNdêr"~*({"w    z°dONLNdísa~h)?w
  946. ö°dONLNdìrh~p)etsœ°dONLNdñr±~ª)I38Û#°dONLNdûÑπêÁ+ (continued)ˇ‘◊#ˇ ˇˇˇˇ#◊
  947. ˇ·ˇ‚ˆA
  948. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{)Summary of Phonemes and Prosodic Controls, Palatino
  949. (ø˝47(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  950. ≥9¡4¥9¡    °dONLNd5≤{Ωé(∫{Note
  951. ˇ·ˇ‚ˆA
  952. °dONLNd:ø{À(*%The “silence” phoneme (%) and the “brƒ‡°dONLNd_ø(À°)≠eath” phoneme (@) may be °dONLNdxÀ{◊U(‘{/lengthened or shortened like any other phoneme.,Zapf Dingbatsô °dONLNd®ŒZ÷`)flu
  953. 949 9
  954. ˇ·ˇ‚ˆA°dONLNd™¯9ß(9Prosodic Controlsˇˇˇˇˇˇ∑†(ˇ1
  955. °dONLNdΩ{€({The symbols listed in ̆°dONLNd”€·)`T#`°dONLNd‘·)able 1-30‡°dONLNd‹)" aru‡°dONLNdfl) e rÑÄ°dONLNd‚q) ecognized as modifi˘Ä°dONLNdıq‰)Xers to the basic phonemes °dONLNd{'Õ(${described in the pr8‡°dONLNd"Œ')Seceding section.âÄ°dONLNd2'Ç)F They can be used to morW °dONLNdJÉ'î)oe prg‡°dONLNdNî'À)ecisely contrF¿°dONLNd[À'Ê)7ol the °dONLNdb({4â(1{=quality of speech that is described in terms of raw phonemes.§ó°dONLNdˇˇ(j@y    z°dONLNdˇˇ)?y
  956. J°dONLNdˇˇ)etsœ°dONLNdˇˇ)K39°dONLNds9A(|9%∞Ω°dONLNdsxï)?silenceºÏ°dONLNd
  957. sƒ…)L0§ó°dONLNd s@E)|z    z°dONLNdtÉ)?z
  958. ûz°dONLNdsÉç)ensœ°dONLNdsœŸ)L40°dONLNdÖ9ë@(é9@∞Ω°dONLNdÖxëÅ)?br˝]°dONLNdÖÅëñ)    eath ∞Ω°dONLNdêxúì(ôxintakeºÏ°dONLNd&Öƒë…(éƒ1§ó°dONLNd(Ö@ëF)|Z    z°dONLNd*ÜëÑ)?g
  959. ù⁄°dONLNd+ÖÑëó)enresœ°dONLNd0ÖœëŸ)K41
  960. W9_4X9_ [{[
  961. ˇ·ˇ‚ˆA    °dONLNd†M{X¢(U{    Table 1-3
  962. °dONLNd™LπX¬)>PrN†°dONLNd¨L√X˘)
  963. osodic contr)Ä°dONLNd∏L˘X()6
  964. ol symbols     °dONLNdˇˇ)/ °dONLNdΔe9p>(m9TT°dONLNdœe>pM)ype’U°dONLNd”e•p≈)gSymbolUV°dONLNd€e>pî)ôDescription of effect°dONLNdÛw9Çr(9Lexical stress:
  965. UV°dONLNds>e(|>    Marks str⁄÷°dONLNdse´)'ess within a word°dONLNd"Ö9ë;(é9 °dONLNd#Ö<ë>) °dONLNd$Ö>ëp) Primary str~¿°dONLNd/Öpë})2ess’U°dONLNd3Ö•ë™)51™©°dONLNd5Ö€ë)6 anticipationUV°dONLNdBÖ>ëÚ)c%AEnt2IHsIXp1EYSAXn   (“anticipation”)°dONLNdjó9£;(†9 °dONLNdkó<£>) °dONLNdló>£z)Secondary str¢`°dONLNdyóz£á)<ess’U°dONLNd}ó•£™)+2™©°dONLNdó€£)6 anticipation    °dONLNdè≠9∏x(µ9Syllable breaks:
  966. UV°dONLNd¢©>µÉ(≤>Marks syllable brÚñ°dONLNd≥©ÉµŒ)Eeaks within a word°dONLNd»ª9«;(ƒ9 °dONLNd…ª<«>) °dONLNd ª>«z)Syllable mark’U°dONLNdÿª•«´)g=™©°dONLNd⁄ª€«˘)6(equal)UV°dONLNd‚ª>«)c'AEn=t2IH=sIX=p1EY=SAXn (“anticipation”)UV°dONLNd    Õ>Ÿ√* Marks the beginning of a word (r¢ˆ°dONLNd)Õ√Ÿ◊)Öequir3ˆ°dONLNd.ÕÿŸ‰)ed)    °dONLNd4—9‹Ç(Ÿ9Word prominence:
  967. °dONLNdJfl9Î;* °dONLNdKfl<Î>) °dONLNdLfl>ÎW)Unstr]°dONLNdQflWÎo)essed’U°dONLNdWfl•δ)N~™©°dONLNdYfl€Î    )6 (asciitilde)UV°dONLNdffl>Îx)c Used for woråv°dONLNdrflxÎ˙):ds with minimal information UV°dONLNdéÍ>ˆ^(Û>content°dONLNdò¸9;(9 °dONLNdô¸<>) °dONLNdö¸>n)
  968. Normal str∑¿°dONLNd§¸n{)0ess’U°dONLNd®¸•™)7_™©°dONLNd™¸€ )6
  969. (underscorñ…°dONLNd¥¸ )0e)UV°dONLNd∑¸>‘)3 Used for information-bearing wor®v°dONLNd◊¸‘fi)ñds°dONLNd‹9;(9 °dONLNd›<>) °dONLNdfi>v) Emphatic str¢†°dONLNdÍvÉ)8ess’U°dONLNdÓ•´)/+™©°dONLNd€Ù)6(plus)UV°dONLNd˜>≥)cspecial emphasis for a wor¿°dONLNd≥π)udUV°dONLNd >,n()> Placed beforê6°dONLNd n,«)0e the affected phonemeUV°dONLNd42>>Ò(;>(pitch will rise on the following phoneme    °dONLNd_$9/\(,9Prosodic
  970. °dONLNdm29>;* °dONLNdn2<>>) °dONLNdo2>>f)
  971. Pitch rise’U°dONLNdz2•>´)g/™©°dONLNd|2€>˜)6(slash)°dONLNdáD9P;(M9 °dONLNdàD<P>) °dONLNdâD>Pe)
  972. Pitch fall’U°dONLNdîD•P´)g\™©°dONLNdñD€P )6 (backslash)UV°dONLNd¢D>PÔ)c(pitch will fall on the following phoneme°dONLNdÕV9b;(_9 °dONLNdŒV<b>) °dONLNdœV>bj)    Lengthen °dONLNdÿa9m;(j9 °dONLNdŸa<m>) °dONLNd⁄a>mg)phoneme’U°dONLNd‚V•b´(_•>™©°dONLNd‰V€bÁ)6(grR©°dONLNdÁVËb)eater)UV°dONLNdÓV>bÈ)V'lengthen the duration of the following UV°dONLNda>mg* phoneme°dONLNds9;(|9 °dONLNd s<>) °dONLNd!s>å)Shorten phoneme’U°dONLNd1s•´)g<™©°dONLNd3s€Ò)6(less)UV°dONLNd:s>‰)c&shorten the duration of the following UV°dONLNd`~>äg* phoneme™´°dONLNdnê«úı+â (continued)
  973. F9M4F9M I{I
  974. ˇ·ˇ‚ˆA    °dONLNdˇˇ(C{    Table 1-2°dONLNdˇˇ)> American English phoneme symbols@°dONLNdˇˇ)í  (continued)°dONLNdˇˇ([9Symbol∞Ω°dONLNdˇˇ)?ExampleºÏ°dONLNdˇˇ)LOpcode§ó°dONLNdˇˇ)|Symbolz°dONLNdˇˇ)?Examplesœ°dONLNdˇˇ)POpcodeˇË◊#ˇ ˇˇˇˇ#◊
  975. ˇ·ˇ‚ˆA
  976. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  977. (ø48    )B)Summary of Phonemes and Prosodic Controls*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ
  978. °dONLNd‹Ã]ÿz(’]Specifi‡°dONLNd„ÃzÿΩ)Gc pitch contours associated with these punctuation marks may vary accor[@°dONLNd*Ãæÿ‡(’æding to °dONLNd2Ÿ]Â¥(‚]Qother considerations in the analysis of the text, such as whether a question is rê`°dONLNdÉŸ¥ÂË(‚¥hetorical or °dONLNdêÊ]Úö(Ô]begins with a *@°dONLNdûÊõÚß)>whb`°dONLNd†ÊßÚ„)  question wor `°dONLNd≠ʉÚ0)=d, so the above efdONLNdøÊ0Úx)Lfects should be r«`°dONLNd–ÊxÚã)Hegar °dONLNd‘ÊãÚ¿) ded only as °dONLNd‡Û]ˇk(¸]?guidelines and not absolute. This also applies to the timing efÄ°dONLNdÛlˇÕ(¸lfects, which will vary °dONLNd6] t(    ]accorõ°dONLNd;t ∏)ding to the currC‡°dONLNdKπ ˝)Eent rate setting.°dONLNd]]z(]The prLJ°dONLNdcz∞) osodic contr]¿°dONLNdo∞ö)65ol symbols (/, \, <, and >) may be concatenated to pr∞°dONLNd§ö«)Í    ovide mor(°dONLNd≠»œ).e °dONLNdØ]+‘((]exaggerated, cumulative efπ‡°dONLNd…‘+)wfects. The specifip‡°dONLNd€+;)Ic naturA°dONLNd‚<+g) e of the ef!@°dONLNdÌg+”)+fect is dependent on the °dONLNd,]8Ø(5]speech synthesizer≥ °dONLNd,Ø8∂)R<. Speech synthesizers also often extend or enhance the contr °dONLNdT,∑8Δ(5∑ols °dONLNdX9]EÃ(B]described in this section.     °dONLNdbmM(j Punctuation:UV°dONLNdb mL(j  Pitch effect™´°dONLNdb©mÆ)âTÀ°dONLNdbØm›) iming effect
  979. ’U°dONLNd,pá|â(yá.™©°dONLNd.pΩ|‡)6(period)UV°dONLNd7p |O)c
  980. Sentence fi‘°dONLNdBpO|m)/nal fall™´°dONLNdKp©|Ê)ZPause follows’U°dONLNd[Çáéã(ãá?™©°dONLNd]ÇΩéÈ)6
  981. (question)UV°dONLNdhÇ éO)c
  982. Sentence fi‘°dONLNdsÇOéo)/nal rise™´°dONLNd|Ç©éÊ)ZPause follows’U°dONLNdåîá†â(ùá!™©°dONLNdéîΩ†‚)6(exclam)UV°dONLNdóî †O)c
  983. Sentence fi‘°dONLNd¢îO†à)/nal sharp fall™´°dONLNd±î©†Ê)ZPause follows’U°dONLNd¡¶á≤ë(Øá…™©°dONLNd√¶Ω≤‚)6
  984. (ellipsis)UV°dONLNdŒ¶ ≤F)cClause fiÔ6°dONLNd◊¶F≤k)&    nal level™´°dONLNd·¶©≤Ê)cPause follows’U°dONLNdÒ∏áƒâ(¡á,™©°dONLNdÛ∏Ωƒ‰)6(comma)UV°dONLNd˚∏ ƒm)cContinuation rise™´°dONLNd∏©ƒfl)â Short pause ™´°dONLNd√©œ…* follows’U°dONLNd#’á·â(fiá;™©°dONLNd%’Ω·)6 (semicolon)UV°dONLNd1’ ·o)cContinuation rise ™´°dONLNdD’©·fl)â Short pause ™´°dONLNdP‡©Ï…* follows’U°dONLNdZÚá˛â(˚á:™©°dONLNd\ÚΩ˛€)6(colon)UV°dONLNddÚ ˛F)cClause fiÔ6°dONLNdmÚF˛m)&
  985. nal level ™´°dONLNdxÚ©˛fl)c Short pause ™´°dONLNdÑ˝©    …* follows’U°dONLNdéáä(á(™©°dONLNdêΩœ)6(par≈©°dONLNdîœÎ)enleft)UV°dONLNdú ;)QStart rQv°dONLNd£;v) educed range™´°dONLNd∞©fl)n Short pause ™´°dONLNdº©&≤* prqÀ°dONLNdæ≥&–)
  986. ecedes’U°dONLNd«,á8ä(5á)™©°dONLNd…,Ω8œ)6(par≈©°dONLNdÕ,œ8Ú)enright)UV°dONLNd÷, 88)QEnd r£6°dONLNd€,88s) educed range™´°dONLNdË,©8fl)q Short pause ™´°dONLNdÙ7©C…* follows’U°dONLNd˛IáUå(Rá“’U°dONLNdTá`â* ‘™©°dONLNdIΩU˚(RΩ(quotedblleft, ™©°dONLNdTΩ`* quotesingleleft)UV°dONLNd"I U'(R V¢v°dONLNd#I&U:)aries™´°dONLNd)I©U∞)ÉV˜À°dONLNd*IØU√)aries’U°dONLNd2fárå(oá”’U°dONLNd4qá}â* ’™©°dONLNd6fΩr(oΩ(quotedblright, ™©°dONLNdFqΩ}    * quotesingleright)UV°dONLNdXf r'(o V¢v°dONLNdYf&r:)aries™´°dONLNd_f©r∞)ÉV˜À°dONLNd`fØr√)aries’U°dONLNdhÉáèä(åá-™©°dONLNdjÉΩèÂ)6(hyphen)UV°dONLNdsÉ èG)cClause-fi√°dONLNd|ÉGèl)'    nal level™´°dONLNdÜÉ©èfl)b Short pause ™´°dONLNdíé©ö…* follows’U°dONLNdú†á¨é(©á&™©°dONLNdû†Ω¨ı)6 (ampersand)UV°dONLNd™† ¨.)cForˆ°dONLNd≠†/¨»)#ces no addition of silence between UV°dONLNd–´ ∑M(¥ phonemes
  987. FMÈ4FMÈ I]IÈ
  988. ˇ·ˇ‚ˆA    °dONLNdˇˇ(C]    Table 1-3
  989. °dONLNdˇˇ)>PrN†°dONLNdˇˇ)
  990. osodic contr)Ä°dONLNdˇˇ)6
  991. ol symbols     °dONLNdˇˇ)/  (continued)°dONLNdˇˇ([TT°dONLNdˇˇ)ype’U°dONLNdˇˇ)gSymbolUV°dONLNdˇˇ)ôDescription of effectˇ –◊#ˇ ˇˇˇˇ#◊
  992. ˇ·ˇ‚ˆA
  993. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Summary of the Speech Manager, Palatino
  994. (ø˝49(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  995. =9W4=9W
  996. g9o4h9o i9i
  997. ˇ·ˇ‚ˆAˇˇ©ˇÆ°dONLNdT9g((b9Summary of the Speech ManagerˇˇˇˇˇˇV˛(bˇ1
  998. †9ß4†9ß °9°
  999. ˇ·ˇ‚ˆA°dONLNdë9†x(ú9    Constantsˇˇˇˇˇˇ∑†(úˇ1,
  1000. Courier
  1001. .°dONLNd*≤9æœ(ª9#define gestaltSpeechAttr°dONLNdL≤€æˇ)¢'ttsc'°dONLNdT≤ˇæ„)$&// Gestalt Manager selector for speech°dONLNdá¿ÃY+  attributes °dONLNdîŸ9Â](‚9enum {°dONLNdõÁ9Û…* gestaltSpeechMgrPresent°dONLNdºÁ€ÛÌ)¢= 0°dONLNd¡ÁˇÛı)$)// Gestalt bit that indicates that Speech°dONLNd˜ık+Manager exists °dONLNd9E( 9};°dONLNd 9+Ì*#define kTextToSpeechSynthType°dONLNd6#+G)Í'ttsc'°dONLNd?Y+ø)6// text-to-speech°dONLNda-Y9˚*synthesizer component type °dONLNd};9GÌ(D9#define kTextToSpeechVoiceType°dONLNd®;#GG)Í'ttvd'°dONLNd±;YG„)6// text-to-speech voice°dONLNdŸIYU≠*resource type °dONLNdËW9c(`9"#define kTextToSpeechVoiceFileType°dONLNdW#cG)Í'ttvf'°dONLNd WYc)6// text-to-speech voice file°dONLNdMeYqw*type °dONLNdSs9(|9$#define kTextToSpeechVoiceBundleType°dONLNdÑs#G)Í'ttvb'°dONLNdçsY„)6// text-to-speech voice°dONLNdµÅYçø*bundle file type °dONLNd»ù9©](¶9enum {°dONLNd—ùo©≠)65// Speech Manager error codes (range from 240 - 259) °dONLNd´K∑ì(¥K noSynthFound°dONLNd´…∑Û)~= -240,°dONLNd$πK≈•(¬KsynthOpenFailed°dONLNd:π…≈Û)~= -241,°dONLNdC«K”ô(–KsynthNotReady°dONLNdW«…”Û)~= -242,°dONLNd`’K·ç(fiK bufTooSmall°dONLNdr’…·Û)~= -243,°dONLNd{„KÔô(ÏKvoiceNotFound°dONLNdè„…ÔÛ)~= -244,°dONLNdòÒK˝±(˙KincompatibleVoice°dONLNd∞Ò…˝Û)~= -245,°dONLNdπˇK ô(KbadDictFormat°dONLNdÕˇ… Û)~= -246,°dONLNd÷Kü(KbadPhonemeText°dONLNdÎ…Ì)~= -247°dONLNdÚ9'E($9};°dONLNdˆB9N]*'enum {°dONLNdBìN≈)Z3// constants for SpeakBuffer and text done callback°dONLNd:Pì\* controlFlags bits °dONLNdO^Kj´(gKkNoEndingProsody°dONLNdg^€jÛ)ê= 1,°dONLNdmlKx∑(uKkNoSpeechInterrupt°dONLNdál€xÛ)ê= 2,°dONLNdçzKÜΩ(ÉKkPreflightThenPause°dONLNd®z€ÜÌ)ê= 4°dONLNd¨à9îE(ë9};ˇd◊#ˇ ˇˇˇˇ#◊
  1002. ˇ·ˇ‚ˆA
  1003. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  1004. (ø50    )BSummary of the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  1005. Courier
  1006. .°dONLNd;G?(Denum {°dONLNd ;uGï)Z0// constants for StopSpeechAt and PauseSpeechAt °dONLNd=I-Ui(R-
  1007. kImmediate°dONLNdMIôU±)l= 0,°dONLNdSW-ci(`-
  1008. kEndOfWord°dONLNdcWôc±)l= 1,°dONLNdie-qÅ(n-kEndOfSentence°dONLNd}eôq´)l= 2°dONLNdÅs'(|};°dONLNdÖèõ*+// GetSpeechInfo & SetSpeechInfo selectors °dONLNd±ù©{*#define soStatus°dONLNdÀùœ©Û)¥'stat'°dONLNd“´∑{(¥#define soErrors°dONLNdÏ´œ∑Û)¥'erro'°dONLNdÛπ≈ç(¬#define soInputMode°dONLNdπœ≈Û)¥'inpt'°dONLNd«”•(–#define soCharacterMode°dONLNd8«œ”Û)¥'char'°dONLNd?’·ì(fi#define soNumberMode°dONLNd]’œ·Û)¥'nmbr'°dONLNdd„Ôo(Ï#define soRate°dONLNd|„œÔÛ)¥'rate'°dONLNdÉÒ˝ç(˙#define soPitchBase°dONLNd†Òœ˝Û)¥'pbas'°dONLNdߡ á(#define soPitchMod°dONLNd√ˇœ Û)¥'pmod'°dONLNd {(#define soVolume°dONLNd‰œÛ)¥'volm'°dONLNdÎ'ç($#define soSynthType°dONLNdœ'Û)¥'vers'°dONLNd)5ì(2#define soRecentSync°dONLNd-)œ5Û)¥'sync'°dONLNd47C´(@#define soPhonemeSymbols°dONLNdV7œCÛ)¥'phsy'°dONLNd]EQü(N#define soCurrentVoice°dONLNd}EœQÛ)¥'cvox'°dONLNdÑS_∑(\#define soCommandDelimiter°dONLNd®Sœ_Û)¥'dlim'°dONLNdØamu(j#define soReset°dONLNd»aœmÛ)¥'rset'°dONLNdœo{ç(x#define soCurrentA5°dONLNdÏoœ{Û)¥'myA5'°dONLNdÛ}â{(Ü#define soRefCon°dONLNd}œâÛ)¥'refc'°dONLNdãó∑(î#define soTextDoneCallBack°dONLNd8ãœóÛ)¥'tdcb'°dONLNd?ô•√(¢#define soSpeechDoneCallBack°dONLNdeôœ•Û)¥'sdcb'°dONLNdlß≥ü(∞#define soSyncCallBack°dONLNdåßœ≥Û)¥'sycb'°dONLNd쵡•(æ#define soErrorCallBack°dONLNd¥µœ¡Û)¥'ercb'°dONLNdª√œ±(Ã#define soPhonemeCallBack°dONLNdfi√œœÛ)¥'phcb'°dONLNd—›ü(⁄#define soWordCallBack°dONLNd—œ›Û)¥'wdcb'°dONLNd flδ(Ë#define soSynthExtension°dONLNd.flœÎÛ)¥'xtnd'°dONLNd6˚Ω(// speaking mode constants °dONLNdR    {*#define modeText°dONLNdj    ´’)ê'TEXT' °dONLNdr    ’e)*// input mode constants °dONLNdã#o( #define modeTX°dONLNd°´#√)ê'TX'°dONLNd¶%1ì(.#define modePhonemes°dONLNd¬%´1œ)ê'PHON'°dONLNd…3?o(<#define modePH°dONLNdfl3´?√)ê'PH'°dONLNd‰AMá(J#define modeNormal°dONLNd˛A´Mœ)ê'NORM'°dONLNdAœM’)$ °dONLNdA’M›),// character mode and number mode constants °dONLNd4O[ç(X#define modeLiteral°dONLNdOO´[œ)ê'LTRL'ˇ∏◊#ˇ ˇˇˇˇ#◊
  1009. ˇ·ˇ‚ˆA
  1010. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Summary of the Speech Manager, Palatino
  1011. (ø˝51(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  1012. Courier
  1013. .°dONLNd;9G](D9enum {°dONLNd;G≠)ÿ// GetVoiceInfo selectors °dONLNd.IKU∑(RKsoVoiceDescription°dONLNdGI…Uˇ)~    = 'info',°dONLNdTIUß)H// gets basic voice info °dONLNdoWKcç(`K soVoiceFile°dONLNdÅW…c˘)~= 'fref'°dONLNdçWcπ)H// gets voice file ref info °dONLNd™e9qE(n9};°dONLNd≠s9 *#enum {kNeuter = 0, kMale, kFemale};°dONLNd‹s›)ÿ"// returned in gender field below 
  1014. ±9∏4±9∏ ≤9≤
  1015. ˇ·ˇ‚ˆA.°dONLNdˇ¢9±Z(≠9Data ≥¿°dONLNd¢Z±b)!T| °dONLNd¢b±)ypesˇˇˇˇˇˇ∑†(≠ˇ1
  1016. .°dONLNd √9œ(Ã9$typedef struct SpeechChannelRecord {°dONLNd1—K›ô+long data[1];°dONLNd?fl9ÎΩ(Ë9} SpeechChannelRecord;°dONLNdW˚9;*+typedef SpeechChannelRecord *SpeechChannel;°dONLNdÑ9#’*typedef struct VoiceSpec {°dONLNd†%K1o+OSType°dONLNd©%Å1±)6creator;°dONLNdµ%…1≠)H&// creator ID of required synthesizer °dONLNd›3K?o(<KOSType°dONLNdÊ3Å?ì)6id;°dONLNdÌ3…?õ)H#// voice ID on the specified synth °dONLNdA9MÅ(J9 } VoiceSpec;°dONLNdZ9fˇ*!typedef struct VoiceDescription {°dONLNdAhKtc+long°dONLNdIhìtΩ)Hlength;°dONLNdUhÌtÈ)Z*// size of structure - set by application °dONLNdÅvKÇÅ(K    VoiceSpec°dONLNdévìÇ∑)Hvoice;°dONLNdôvÌÇõ)Z// voice creator and ID info °dONLNd∏ÑKêc(çKlong°dONLNd¿Ñìê√)Hversion;°dONLNdÕÑÌêâ)Z// version code for voice °dONLNdÈíKûi(õKStr63°dONLNdÚíìû±)Hname;°dONLNd¸íÌûS)Z// name of voice °dONLNd†K¨o(©KStr255°dONLNd†ì¨√)Hcomment;°dONLNd&†Ì¨≈)Z$// additional text info about voice °dONLNdLÆK∫i(∑Kshort°dONLNdUÆì∫Ω)Hgender;°dONLNdaÆÌ∫è)Z// neuter, male, or female °dONLNd~ºK»i(≈Kshort°dONLNdáºì»´)Hage;°dONLNdêºÌ»ï)Z// approximate age in years °dONLNdÆ K÷i(”Kshort°dONLNd∑ ì÷Ω)Hscript;°dONLNd√ Ì÷„)Z)// script code of text voice can process °dONLNdÓÿK‰i(·Kshort°dONLNd˜ÿ쉅)H    language;°dONLNdÿ̉≥)Z!// language code of voice output °dONLNd(ÊKÚi(ÔKshort°dONLNd1ÊìÚΩ)Hregion;°dONLNd=ÊÌÚß)Z// region code of voice output °dONLNd^ÙKc(˝Klong°dONLNdfÙì€)H reserved[4];°dONLNdwÙÌè)Z// reserved for future use °dONLNdì9´( 9} VoiceDescription;°dONLNd®9*Ì*typedef struct VoiceFileInfo {°dONLNd»,K8o+FSSpec°dONLNd—,Å8∑)6    fileSpec;°dONLNdfi,…8ı)H2// volume, dir, & name information for voice file °dONLNd:KFi(CKshort°dONLNd:ÅF•)6resID;°dONLNd$:…F°)H$// resource ID of voice in the file °dONLNdIH9Tô(Q9} VoiceFileInfo;ˇ8◊#ˇ ˇˇˇˇ#◊
  1017. ˇ·ˇ‚ˆA
  1018. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  1019. (ø52    )BSummary of the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  1020. Courier
  1021. .°dONLNd;G·(D!typedef struct SpeechStatusInfo {°dONLNd#I-UW+Boolean°dONLNd-IcU•)6 outputBusy;°dONLNd>IœUw)l// true if audio is playing °dONLNd\W-cW(`-Boolean°dONLNdfWcc±)6outputPaused;°dONLNdyWœc})l// true if channel is paused °dONLNdòe-qE(n-long°dONLNdüecqΩ)6inputBytesLeft;°dONLNd¥eœqe)l// bytes left to process °dONLNdœs-K(|-short°dONLNd◊sc´)6 phonemeCode;°dONLNdÈsœk)l// opcode for cur phoneme °dONLNdÅçç(ä} SpeechStatusInfo;°dONLNdù©€* typedef struct SpeechErrorInfo {°dONLNd;´-∑K+short°dONLNdC´c∑á)6count;°dONLNdL´ô∑M)6// # of errs since last check °dONLNdlπ-≈K(¬-OSErr°dONLNdtπc≈ç)6oldest;°dONLNd~πô≈#)6// oldest unread error °dONLNdó«-”E(–-long°dONLNdû«c”ç)6oldPos;°dONLNd®«ô”S)6// char position of oldest err °dONLNd…’-·K(fi-OSErr°dONLNd—’c·ç)6newest;°dONLNd€’ô·)6// most recent error °dONLNdÚ„-ÔE(Ï-long°dONLNd˘„cÔç)6newPos;°dONLNd„ôÔS)6// char position of newest err °dONLNd#Ò˝á(˙} SpeechErrorInfo;°dONLNd7Á*"typedef struct SpeechVersionInfo {°dONLNd[-'Q+OSType°dONLNdeu'±)H
  1022. synthType;°dONLNdvÛ'Y)~// always 'ttsc' °dONLNdâ)-5Q(2-OSType°dONLNdì)u5√)HsynthSubType;°dONLNdß)Û5S)~// synth flavor °dONLNdπ7-CQ(@-OSType°dONLNd√7uC·)HsynthManufacturer;°dONLNd‹7ÛCk)~// synth creator ID °dONLNdÚE-QE(N-long°dONLNd˙EuQ∑)H synthFlags;°dONLNd EÛQ})~// synth feature flags °dONLNd%S-_i(\-
  1023. NumVersion°dONLNd3Su_√)HsynthVersion;°dONLNdGSÛ_É)~// synth version number °dONLNd`amì(j} SpeechVersionInfo;°dONLNduzÜ√*typedef struct PhonemeInfo {°dONLNdìà-îK+short°dONLNdõàcîç)6opcode;°dONLNdßàΩîY)Z// opcode for the phoneme °dONLNd√ñ-¢K(ü-Str15°dONLNdÀñc¢á)6phStr;°dONLNd÷ñΩ¢k)Z// corresponding char string °dONLNdı§-∞K(≠-Str31°dONLNd˝§c∞•)6 exampleStr;°dONLNd§Ω∞â)Z"// word that shows use of phoneme °dONLNd1≤-æK(ª-short°dONLNd9≤cæ´)6 hiliteStart;°dONLNdJ≤Ωæ})Z // segment of example word that °dONLNdl¿-ÃK(…-short°dONLNdt¿cÃü)6
  1024. hiliteEnd;°dONLNdÉ¿ΩÃ’)Z//  °dONLNdá¿’À) °dONLNdà¿€Ãè)hilighted text (ala TextEdit) °dONLNdߌ⁄o(◊} PhonemeInfo;°dONLNd∑͈Á*"typedef struct PhonemeDescriptor {°dONLNd€¯-K+short°dONLNd¯á’)ZphonemeCount;°dONLNd¯¯ÛY)l// # of elements °dONLNd -o(- PhonemeInfo°dONLNdá·)ZthePhonemes[1];°dONLNd0ÛS)l// element list °dONLNdA ì(} PhonemeDescriptor;°dONLNdW0<’*typedef struct SpeechXtndData {°dONLNdx>-JQ+OSType°dONLNdÅ>cJ±)6synthCreator;°dONLNdì>ΩJ5)Z// synth creator ID °dONLNd©L-XE(U-Byte°dONLNd∞LcX±)6synthData[2];°dONLNd¬LΩX;)Z// data TBD by synth °dONLNdÿZfÅ(c} SpeechXtndData;ˇ ‡◊#ˇ ˇˇˇˇ#◊
  1025. ˇ·ˇ‚ˆA
  1026. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Summary of the Speech Manager, Palatino
  1027. (ø˝53(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü,
  1028. Courier
  1029. .°dONLNd;9GÌ(D9typedef struct DelimiterInfo {°dONLNd IKUc+Byte°dONLNd'IÅUÌ)6startDelimiter[2];°dONLNd@IˇUk)~// defaults to [[ °dONLNdTWKcc(`KByte°dONLNd[WÅc·)6endDelimiter[2];°dONLNdrWˇck)~// defaults to ]] °dONLNdÖe9qô(n9} DelimiterInfo;
  1030. £9™4£9™ §9§
  1031. ˇ·ˇ‚ˆA.°dONLNdñî9£B*1V†°dONLNdóîB£ñ)    oice Routinesˇˇˇˇˇˇ∑†(üˇ1
  1032. .°dONLNd¶µ9¡Ô(æ9Ipascal OSErr MakeVoiceSpec (OSType creator, OSType id, VoiceSpec *voice);°dONLNd√9œA*,pascal OSErr CountVoices (short *numVoices);°dONLNd—9›è*9pascal OSErr GetIndVoice (short index, VoiceSpec *voice);°dONLNdWfl9Î˚*Kpascal OSErr GetVoiceDescription (VoiceSpec *voice, VoiceDescription *info,°dONLNd§ÌK˘∑+ long infoLength);°dONLNd∑˚9≈(9Bpascal OSErr GetVoiceInfo (VoiceSpec *voice, OSType selector, void°dONLNd˚    Kô+ *voiceInfo);
  1033. G9N4G9N H9H
  1034. ˇ·ˇ‚ˆA.°dONLNd    89G8(C9%Routines for Managing Speech Channelsˇˇˇˇˇˇ∑†(Cˇ1
  1035. .°dONLNd0Y9e›(b9Fpascal OSErr NewSpeechChannel (VoiceSpec *voice, SpeechChannel *chan);°dONLNdwg9sÉ*7pascal OSErr DisposeSpeechChannel (SpeechChannel chan);
  1036. •9¨4•9¨ ¶9¶
  1037. ˇ·ˇ‚ˆA.°dONLNdØñ9•Æ*1Speaking Routinesˇˇˇˇˇˇ∑†(°ˇ1
  1038. .°dONLNd¬∑9√#(¿9'pascal OSErr SpeakString (StringPtr s);°dONLNdÍ≈9—Ô*Ipascal OSErr SpeakText (SpeechChannel chan, Ptr textBuf, long textBytes);°dONLNd4”9flG*-pascal OSErr StopSpeech (SpeechChannel chan);°dONLNdb·9Ìø*Apascal OSErr StopSpeechAt (SpeechChannel chan, long whereToStop);°dONLNd§Ô9˚À*Cpascal OSErr PauseSpeechAt (SpeechChannel chan, long whereToPause);°dONLNdË˝9    _*1pascal OSErr ContinueSpeech (SpeechChannel chan);°dONLNd 9ı*Jpascal OSErr SpeakBuffer (SpeechChannel chan, Ptr textBuf, long textBytes,°dONLNdfK%Ω+long controlFlags);
  1039. W9^4W9^ X9X
  1040. ˇ·ˇ‚ˆA.°dONLNdzH9W(S9 Information and Control Routinesˇˇˇˇˇˇ∑†(Sˇ1
  1041. .°dONLNdúi9uM(r9.pascal NumVersion SpeechManagerVersion (void);°dONLNdÀw9ÉÛ*pascal short SpeechBusy (void);°dONLNdÎÖ9ë°*<pascal OSErr SetSpeechRate (SpeechChannel chan, Fixed rate);°dONLNd(ì9üß*=pascal OSErr GetSpeechRate (SpeechChannel chan, Fixed *rate);ˇ
  1042. p◊#ˇ ˇˇˇˇ#◊
  1043. ˇ·ˇ‚ˆA
  1044. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  1045. (ø54    )BSummary of the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈ,
  1046. Courier
  1047. .°dONLNd;Gè(D>pascal OSErr SetSpeechPitch (SpeechChannel chan, Fixed pitch);°dONLNd?IUï*?pascal OSErr GetSpeechPitch (SpeechChannel chan, Fixed *pitch);°dONLNdWc*)pascal short SpeechBusySystemWide (void);°dONLNd©eqπ*Epascal OSErr SetSpeechInfo (SpeechChannel chan, OSType selector, void°dONLNds-Å+ *speechInfo);°dONLNdˇÅçπ(äEpascal OSErr GetSpeechInfo (SpeechChannel chan, OSType selector, void°dONLNdFè-õÅ+ *speechInfo);
  1048. Õ‘È4Õ‘È ŒŒÈ
  1049. ˇ·ˇ‚ˆA.°dONLNdUæÕ#(…T°dONLNdVæ"Õ)!ext-to-Phoneme Conversion Routineˇˇˇˇˇˇ∑†(…·1
  1050. .°dONLNdyflÎè(Ë>pascal OSErr TextToPhonemes (SpeechChannel chan, Ptr textBuf, °dONLNdπÌ-˘w+7long textBytes, Handle phonemeBuf, long *phonemeBytes) 
  1051. +2È4+2È ,,È
  1052. ˇ·ˇ‚ˆA.°dONLNdÒ+‚('Dictionary Management Routineˇˇˇˇˇˇ∑†('·1
  1053. .°dONLNd=Iß(FBpascal OSErr UseDictionary (SpeechChannel chan, Handle dictionary)
  1054. {ÇÈ4{ÇÈ ||È
  1055. ˇ·ˇ‚ˆA.°dONLNdSl{ó*1Callback Prototypesˇˇˇˇˇˇ∑†(w·1
  1056. .°dONLNdjç?ô#(ñ?&// text-done callback routine typedef °dONLNdëõß›(§Ktypedef pascal void (*TextDoneProcPtr) (SpeechChannel, long, Ptr *, long *,°dONLNdfl©?µu+$     long *);°dONLNdÏ≈?—/*(// speech-done callback routine typedef °dONLNd”flõ(‹@typedef pascal void (*SpeechDoneProcPtr) (SpeechChannel, long );°dONLNdYÔ?˚+$!// sync callback routine typedef °dONLNd{˝    °(Atypedef pascal void (*SyncProcPtr) (SpeechChannel, long, OSType);°dONLNd¿?% +$"// error callback routine typedef °dONLNd„'3≈(0Gtypedef pascal void (*ErrorProcPtr) (SpeechChannel, long, OSErr, long);°dONLNd.C?O+$$// phoneme callback routine typedef °dONLNdSQ]≠(ZCtypedef pascal void (*PhonemeProcPtr) (SpeechChannel, long, short);°dONLNdöm?y+$!// word callback routine typedef °dONLNdº{áø(ÑFtypedef pascal void (*WordProcPtr) (SpeechChannel, long, long, short);ˇ p◊#ˇ ˇˇˇˇ#◊
  1057. ˇ·ˇ‚ˆA
  1058. 4ˇ¸9;,     Helvetica    ˇˇ—Ú.ˇÆ+{The Speech Manager4π{Ÿ(ø{Summary of the Speech Manager, Palatino
  1059. (ø˝55(Œ{©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=9ü
  1060. J9R4K9Q L9L
  1061. ˇ·ˇ‚ˆA°dONLNd;9J≤(F9Error Return Codesˇˇˇˇˇˇ∑†(Fˇ1,
  1062. Courier
  1063. .°dONLNdQ9]W(Z9noErr.°dONLNdQŸ]fi)†0°dONLNdQÚ])No errE†°dONLNd Q])or.°dONLNd$]9ii(f9paramErr.°dONLNd-]œifi)ñ–50°dONLNd1]Úi.)#Parameter err¿°dONLNd>]/i8)=or.°dONLNdBh9tu(q9
  1064. memFullErr.°dONLNdMh tfi)ë–108°dONLNdRhÚtv)(Not enough memory to speak.°dONLNdnt9ÄÅ(}9 nilHandleErr.°dONLNd{t Äfi)ë–109.°dONLNdÄtÚÄ!)(    Handle arR`°dONLNdât!ÄM)/
  1065. gument is R`°dONLNdìtMÄ_),nil°dONLNdò9ãü(à9siUnknownInfoType.°dONLNd™ ãfi)ë–231°dONLNdØÚã)(FeaturÁ@°dONLNdµã£) e not implemented on synthesizer.°dONLNd◊ã9óÅ(î9 noSynthFound.°dONLNd‰ã ófi)ë–240°dONLNdÈãÚó')( Could not fi≠¿°dONLNdıã'ób)5nd the specifiÊ`°dONLNdãbó¬);ed speech synthesizer.°dONLNdñ9¢ì(ü9synthOpenFailed.°dONLNd*ñ ¢fi)ë–241°dONLNd/ñÚ¢÷)(1Could not open another speech synthesizer channel.°dONLNdb¢9Æá(´9synthNotReady.°dONLNdp¢ Æfi)ë–242°dONLNdu¢ÚƧ)()Speech synthesizer is still busy speaking.°dONLNd†≠9π{(∂9 bufTooSmall.°dONLNd¨≠ πfi)ë–243°dONLNd±≠Úπ#)(
  1066. Output buf&°dONLNdª≠$πç)2fer is too small to hold r2Ä°dONLNd’≠çπ¢)iesult.°dONLNd‹π9≈á(¬9voiceNotFound.°dONLNdÍπ ≈fi)ë–244°dONLNdÔπÚ≈˘)(Vú`°dONLNdπ¯≈)oice ry °dONLNdˆπ≈()esour¡`°dONLNd˚π(≈_) ce not found.°dONLNd    ƒ9–ü(Õ9incompatibleVoice.°dONLNdƒ –fi)ë–245°dONLNd ƒÚ–)(Specifi‡°dONLNd'ƒ–ƒ)(ed voice cannot be used with synthesizer.°dONLNdQ–9‹á(Ÿ9badDictFormat.°dONLNd_– ‹fi)ë–246°dONLNdd–Ú‹)(    Format pr‘¿°dONLNdm–‹\),oblem with prr °dONLNdz–]‹¡)?onunciation dictionary.°dONLNdí€9Áç(‰9badPhonemeText.°dONLNd°€ Áfi)ë–247°dONLNd¶€ÚÁΩ)(,Raw phoneme text contains invalid characters.°dONLNd‘Á9Û•(9invalidComponentID.°dONLNdÁÁ≈Ûfi)å–3000.°dONLNdÌÁÚÛ)-Invalid °dONLNdıÁÛe)%SpeechChannel°dONLNdÁeÛó)N
  1067.  parameterˇJ◊#ˇ ˇˇˇˇ#◊
  1068. ˇ·ˇ‚ˆA
  1069. 4ˇ¸;È,     Helvetica    ˇˇ—Ú.ˇÆ+]The Speech Manager4πŸÈ, Palatino
  1070. (ø56    )BSummary of the Speech Manager*©®`)1993:‡) Í∞)Apple Computer˙ )6, Inc. 4=üÈˇ